2013-10-03 45 views
0

我想按住一個鍵時,我想讓一個簡單的實體/播放器移動,但只有當按下它時才移動,而不是按住它。我認爲它是我的while循環中的Keyboard.next(),但是這沒有奏效。按住一個鍵時,LWJGL實體沒有移動

import static org.lwjgl.opengl.GL11.*; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import org.lwjgl.input.Mouse; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.*; 
import org.lwjgl.*; 

public class Main { 

int x = 50; 
int y = 50; 
int dx = 1; 
int dy = 1; 
long lastFrame; 
double delta; 

public Main() { 
    try { 
     Display.setDisplayMode(new DisplayMode(640, 480)); 
     Display.setTitle("Input Demo"); 
     Display.create(); 
    } catch(LWJGLException e) { 

    } 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    GL11.glOrtho(0, 800, 0, 600, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    while(!Display.isCloseRequested()) { 
     //Render 

     glClear(GL_COLOR_BUFFER_BIT); 

     drawPlayer(); 
     movePlayer(); 

     Display.update(); 
     Display.sync(60); //60 fps 

     System.out.println("LastFrame:" + lastFrame); 
     System.out.println("Delta:" + delta); 

    } 

    Display.destroy(); 
} 

public void movePlayer() { 
    while(Keyboard.next()) { 
     double delta = getDelta(); 
     if(Keyboard.isKeyDown(Keyboard.KEY_W)) { 
      y += 3 * dy; 
     } else if(Keyboard.getEventKey() == Keyboard.KEY_S && Keyboard.getEventKeyState()) { 
      y -= 3 * dy; 
     } else if(Keyboard.getEventKey() == Keyboard.KEY_A && Keyboard.getEventKeyState()) { 
      x -= 3 * dx; 
     } else if(Keyboard.getEventKey() == Keyboard.KEY_D && Keyboard.getEventKeyState()) { 
      x += 3 * dx; 
     } 
    } 
} 

public void drawPlayer() { 
    glColor3f(3, 0, 0); 

    glPushMatrix(); 
     glTranslatef(x, y, 0); 
     glBegin(GL_QUADS); 
      glVertex2f(x - 25, y - 25); 
      glVertex2f(x + 25, y - 25); 
      glVertex2f(x + 25, y + 25); 
      glVertex2f(x - 25, y + 25); 
     glEnd(); 
    glPopMatrix(); 
} 

public long getTime() { 
    return (Sys.getTime() * 1000)/Sys.getTimerResolution(); 
} 

public double getDelta() { 
    long currentTime = getTime(); 
    double delta = (double)(currentTime - lastFrame); 
    lastFrame = getTime(); 

    return delta; 
} 

public void update(int dx, int dy) { 
    x += dx; 
    y += dy; 
} 

public static void main(String[] argv) { 
    new Main(); 
} 
} 

回答

0

您也可以啓用重複鍵事件。 另外我會建議你明確創建你的鍵盤。 要做到既把這個你Display.create(後),所以它看起來是這樣的:

try { 
     Display.setDisplayMode(new DisplayMode(640, 480)); 
     Display.setTitle("Input Demo"); 
     Display.create(); 
     Keyboard.create(); 
     Keyboard.enableRepeatEvents(true); 
    } catch (LWJGLException e) { 
     //TODO handle exception in a proper way 
    } 

而且你應該堅持在檢查您輸入的一個方法.. 通常用於您檢查KEY_W方式輪詢,但它仍然有效。