Hopefully this is my LAST QUESTION!! D:< Anyway, I saw a code on lloydgoodall.com for an LWJGL FPCamera. It had SEVERAL errors, but I finally got to the (hopefully) last error. "Keyboard must be created before you can query key state"

My code:

``````import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.input.*;
import org.lwjgl.util.vector.Vector3f;
import org.lwjgl.input.Keyboard;

//First Person Camera Controller
public class FPCameraController
{
//3d vector to store the camera's position in
private Vector3f    position    = null;
//the rotation around the Y axis of the camera
private float       yaw         = 0.0f;
//the rotation around the X axis of the camera
private float       pitch       = 0.0f;
//Constructor that takes the starting x, y, z location of the camera
public FPCameraController(float x, float y, float z)
{
//instantiate position Vector3f to the x y z params.
position = new Vector3f(x, y, z);
}
//increment the camera's current yaw rotation
public void yaw(float amount)
{
//increment the yaw by the amount param
yaw += amount;
}

//increment the camera's current yaw rotation
public void pitch(float amount)
{
//increment the pitch by the amount param
pitch += amount;
}
//moves the camera forward relitive to its current rotation (yaw)
public void walkForward(float distance)
{
position.x -= distance * (float)Math.sin(Math.toRadians(yaw));
position.z += distance * (float)Math.cos(Math.toRadians(yaw));
}

//moves the camera backward relitive to its current rotation (yaw)
public void walkBackwards(float distance)
{
position.x += distance * (float)Math.sin(Math.toRadians(yaw));
position.z -= distance * (float)Math.cos(Math.toRadians(yaw));
}

//strafes the camera left relitive to its current rotation (yaw)
public void strafeLeft(float distance)
{
position.x -= distance * (float)Math.sin(Math.toRadians(yaw-90));
position.z += distance * (float)Math.cos(Math.toRadians(yaw-90));
}

//strafes the camera right relitive to its current rotation (yaw)
public void strafeRight(float distance)
{
position.x -= distance * (float)Math.sin(Math.toRadians(yaw+90));
position.z += distance * (float)Math.cos(Math.toRadians(yaw+90));
}

//translates and rotate the matrix so that it looks through the camera
//this dose basic what gluLookAt() does
public void lookThrough()
{
//roatate the pitch around the X axis
GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
//roatate the yaw around the Y axis
GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
//translate to the position vector's location
GL11.glTranslatef(position.x, position.y, position.z);
}

public static void main(String[] args)
{

FPCameraController camera = new FPCameraController(0, 0, 0);

float dx        = 0.0f;
float dy        = 0.0f;
float dt        = 0.0f; //length of frame
float lastTime  = 0.0f; // when the last frame was
float time      = 0.0f;

float mouseSensitivity = 0.05f;
float movementSpeed = 10.0f; //move 10 units per second

//hide the mouse
Mouse.setGrabbed(true);

// keep looping till the display window is closed the ESC key is down
/*
while (!Display.isCloseRequested() &&
!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
{
*/

time = Sys.getTime();
dt = (time - lastTime)/1000.0f;
lastTime = time;

//distance in mouse movement from the last getDX() call.
dx = Mouse.getDX();
//distance in mouse movement from the last getDY() call.
dy = Mouse.getDY();

//controll camera yaw from x movement fromt the mouse
camera.yaw(dx * mouseSensitivity);
//controll camera pitch from y movement fromt the mouse
camera.pitch(dy * mouseSensitivity);

//when passing in the distrance to move
//we times the movementSpeed with dt this is a time scale
//so if its a slow frame u move more then a fast frame
//so on a slow computer you move just as fast as on a fast computer
if (Keyboard.isKeyDown(Keyboard.KEY_W))//move forward
{
camera.walkForward(movementSpeed*dt);
}
if (Keyboard.isKeyDown(Keyboard.KEY_S))//move backwards
{
camera.walkBackwards(movementSpeed*dt);
}
if (Keyboard.isKeyDown(Keyboard.KEY_A))//strafe left
{
camera.strafeLeft(movementSpeed*dt);
}
if (Keyboard.isKeyDown(Keyboard.KEY_D))//strafe right
{
camera.strafeRight(movementSpeed*dt);
}

//set the modelview matrix back to the identity
GL11.glLoadIdentity();
//look through the camera before you draw anything
camera.lookThrough();
//you would draw your scene here.

//draw the buffer to the screen
Display.update();
}

}``````

Uhh... please help : D

## Recommended Answers

Well, from the API doc, it looks like you need to call Keyboard.create() after the display is initialized and before you poll any keyboard state.

I've never used that API though.

## All 3 Replies

So I assume no-one knows the answer?

Well, from the API doc, it looks like you need to call Keyboard.create() after the display is initialized and before you poll any keyboard state.

I've never used that API though.

I don't see anywhere above where you actually initialize the display either.

Take a look at the LWJGL game window setup code in this tutorial and maybe it will provide the pieces you're missing. The complete source files are linked near the top of that page.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.21 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.