LWJGL按住一键

时间:2013-04-17 18:48:54

标签: java keyboard lwjgl keylistener

所以基本上我试图做的是使用LWJGL现在让我的玩家在游戏中移动。玩家目前正在移动,但是当你按住按钮时他并没有继续移动..

public void update(){         而(Keyboard.next()){

        if(Keyboard.getEventKey() == Keyboard.KEY_RIGHT) {
            if(Keyboard.getEventKeyState()){
                System.out.println("KEY DOWN!");
                player.playerMovingRight();
            }
            else{
                System.out.println("KEY RELEASED!");
            }
        }
    }

我尝试使用一段时间(Keyboard.getEventKeyState()),但它只是让游戏崩溃,它无法识别我是否释放了密钥。

那么如果按住按钮而不必快速按下键移动,我怎么能让我的玩家继续前进。如果玩家同时按住2个按钮,我将如何使其工作?

更新的代码:

public void update(){
    while(Keyboard.next()){

        //If key escape is down we shut the application down
        if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
            System.exit(0);
        }

        //If key up was pressed move up
        else if(Keyboard.getEventKey() == Keyboard.KEY_UP) {
            if(Keyboard.getEventKeyState()){
                System.out.println("KEY DOWN!");
                moveUp = true;
            }
            else{
                System.out.println("KEY RELEASED!");
                moveUp = false;
            }
        }
        //If key down was pressed move down
        else if(Keyboard.getEventKey() == Keyboard.KEY_DOWN) {
            if(Keyboard.getEventKeyState()){
                System.out.println("KEY DOWN!");
                moveDown = true;
            }
            else{
                System.out.println("KEY RELEASED!");
                moveDown = false;
            }
        }

        if(moveUp == true){
            player.playerMovingUp();
        }
        if(moveDown == true){
            player.playerMovingDown();
        }
    }

我仍然遇到与代码相同的问题,我开始认为它们是Keyboard.next()阻止我按住按钮而玩家仍在移动。

3 个答案:

答案 0 :(得分:2)

你需要的是一个布尔标志,当按下按钮时触发该标志,并且当按钮被释放时不触发。然后将该标志添加到移动代码之前的if语句中。像这样:

if(Keyboard.getEventKey() == Keyboard.KEY_RIGHT) {
        if(Keyboard.getEventKeyState()){
            System.out.println("KEY DOWN!");
            flag = true;       
        }
        else{
            System.out.println("KEY RELEASED!");
            flag = false;
        }
    }
}

//player movement code

if(flag) {
    player.playerMovingRight();
}

使用多个键的方法是使用布尔触发器数组并重复检查每个键。

答案 1 :(得分:1)

虽然上述答案可行,但LWJGL能够检测是否按下了按键。但是默认情况下不启用它,因此您需要启用它。要做到这一点,只需在输入初始化的某处将此标志设置为true。

Keyboard.enableRepeatEvents(true);

现在在您的事件循环中,只需检查您的密钥以查看它是否是重复(按住键)。

if(Keyboard.isRepeatEvent())

以下是一个小样本,了解如何检查不同关键状态的密钥。

while(Keyboard.next())
    {
        if(Keyboard.getEventKey() == Keyboard.KEY_A)
            if(Keyboard.getEventKeyState())
            {
                if(Keyboard.isRepeatEvent())
                    // Key held down
                else
                    // Key pressed
            }
            else
                // Key released
    }

答案 2 :(得分:1)

while(Keyboard.next())应该与事件一起使用。

在您的情况下,您不希望仅在触发事件时执行某些操作。但是你想要确定每秒多次,无论是否按下了一个键。如果是,你想做某事(例如搬家)。

所以这是使用Keyboard.isKeyDown()功能的最佳解决方案。 一个小例子:

if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
    System.out.println("pressing KEY_UP");
}
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
    System.out.println("pressing KEY_DOWN");
}
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
    System.out.println("pressing KEY_LEFT");
}
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
    System.out.println("pressing KEY_RIGHT");
}

此外,可以找到一个好的教程here