Hello everyone. I’m trying to make my first 3D game and I’am having a lot of troubles how to shoot based on my rotation in the screen. I would like to know the best way of doing that.
Here is what I done so far,as you can see I use the RETURN KEY to activate the shoot.
MAIN CLASS
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
public class Main
{
public static void main(String[] args)
{
initDisplay();
gameLoop();
cleanUp();
}
public static Texture loadTexture(String key)
{
try
{
return TextureLoader.getTexture("png", new FileInputStream(new File("res/" + key + ".png")));
}
catch (IOException ex)
{
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public static void gameLoop()
{
Texture wood = loadTexture("wood");
Camera cam = new Camera(70,(float)Display.getWidth()/(float)Display.getHeight(),0.3f,1000);
Player player = new Player(-cam.getX(),cam.getY(),cam.getZ());
boolean shooting = false;
float bullX = 0,bullY = 0,bullZ = 0;
while(!Display.isCloseRequested())
{
boolean forward = Keyboard.isKeyDown(Keyboard.KEY_W) || Keyboard.isKeyDown(Keyboard.KEY_UP);
boolean backward = Keyboard.isKeyDown(Keyboard.KEY_S) || Keyboard.isKeyDown(Keyboard.KEY_DOWN);
boolean left = Keyboard.isKeyDown(Keyboard.KEY_A);
boolean right = Keyboard.isKeyDown(Keyboard.KEY_D);
if(forward)
cam.moveZ(0.002f);
if(backward)
cam.moveZ(-0.002f);
if(left)
cam.moveX(0.002f);//cam.rotateY(-0.1f);
if(right)
cam.moveX(-0.002f);//cam.rotateY(0.1f);
if(Keyboard.isKeyDown(Keyboard.KEY_LEFT))
cam.rotateY(-0.1f);
if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT))
cam.rotateY(0.1f);
if(Keyboard.isKeyDown(Keyboard.KEY_RETURN)){
shooting = true;
bullX = -cam.getX();
bullY = -cam.getY();
bullZ = -cam.getZ();
}
if(shooting){
double dx = 0.01 * Math.cos(Math.toRadians(cam.getRY() + 90));
double dz = 0.01 * Math.sin(Math.toRadians(cam.getRY() + 90));
bullX-=dx;
bullZ-=dz;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
cam.useView();
glPushMatrix();
{
glColor3f(1.0f,0.5f,0f);
wood.bind();
glBegin(GL_QUADS);
{
glTexCoord2f(0,0);glVertex3f(0,0,0);
glTexCoord2f(0,1);glVertex3f(0,0,-10);
glTexCoord2f(1,1);glVertex3f(10,0,-10);
glTexCoord2f(1,0);glVertex3f(10,0,0);
glColor3f(0f,0.5f,0f);
glVertex3f(0,0,-5);
glVertex3f(0,1,-5);
glVertex3f(1,1,-5);
glVertex3f(1,0,-5);
if(shooting){
glColor3f(1f,0f,0f);
glVertex3f(bullX,bullY,bullZ - 3);
glVertex3f(bullX,bullY+1,bullZ - 3);
glVertex3f(bullX+1,bullY+1,bullZ - 3);
glVertex3f(bullX+1,bullY,bullZ - 3);
}
}
glEnd();
glLoadIdentity();
glBegin(GL_QUADS);
{
glColor3f(0f,0.5f,0f);
glVertex3f(0,0,-5);
glVertex3f(0,1,-5);
glVertex3f(1,1,-5);
glVertex3f(1,0,-5);
}
glEnd();
}
glPopMatrix();
Display.update();
}
}
public static void cleanUp()
{
Display.destroy();
}
public static void initDisplay()
{
try
{
Display.setDisplayMode(new DisplayMode(800,600));
Display.create();
}
catch (LWJGLException ex)
{
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Camera:
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
public class Camera
{
private float x;
private float y;
private float z;
private float rx;
private float ry;
private float rz;
private float fov;
private float aspect;
private float near;
private float far;
public Camera(float fov, float aspect, float near, float far)
{
x = 0;
y = -1f;
z = 0;
rx = 0;
ry = 0;
rz = 0;
this.fov = fov;
this.aspect = aspect;
this.near = near;
this.far = far;
initProjection();
}
private void initProjection()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov,aspect,near,far);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}
public void useView()
{
glRotatef(rx,1,0,0);
glRotatef(ry,0,1,0);
glRotatef(rz,0,0,1);
glTranslatef(x,y,z);
}
public float getX()
{
return x;
}
public float getY()
{
return y;
}
public float getZ()
{
return z;
}
public void setX(float x)
{
this.x = x;
}
public void setY(float y)
{
this.y = y;
}
public void setZ(float z)
{
this.z = z;
}
public float getRX()
{
return rx;
}
public float getRY()
{
return ry;
}
public float getRZ()
{
return rz;
}
public void setRX(float rx)
{
this.rx = rx;
}
public void setRY(float ry)
{
this.ry = ry;
}
public void setRZ(float rz)
{
this.rz = rz;
}
public void moveZ(float amt)
{
z += amt * Math.sin(Math.toRadians(ry + 90));// * Math.sin(Math.toRadians(rx + 90));
x += amt * Math.cos(Math.toRadians(ry + 90));
//y += amt * Math.sin(Math.toRadians(rx));
}
public void moveX(float amt)
{
z += amt * Math.sin(Math.toRadians(ry));
x += amt * Math.cos(Math.toRadians(ry));
}
public void rotateY(float amt)
{
ry += amt;
}
public void rotateX(float amt)
{
rx += amt;
}
public void rotateZ(float amt)
{
rz += amt;
}
}