1

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

公共无效更新(){同时(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() 阻止了我按住按钮并且玩家仍然移动。

4

3 回答 3

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

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

于 2013-04-17T19:03:56.333 回答
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
    }
于 2013-09-04T21:53:15.913 回答
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");
}

此外,可以在这里找到一个很好的教程。

于 2014-10-09T15:19:58.643 回答