0

キーを押したときに単純なエンティティ/プレーヤーを動かそうとしていますが、キーを押したときにのみ動き、押したままにはなりません。while ループの Keyboard.next() だと思ったのですが、うまくいきませんでした。

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();
}
}
4

1 に答える 1

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
    }

また、入力をチェックする 1 つの方法に固執する必要があります。KEY_W をチェックする方法は、通常はポーリングに使用されますが、それでも機能します。

于 2013-10-03T16:13:39.043 に答える