【问题标题】:LWJGL holding a key pressedLWJGL 按住一个键
【发布时间】:2013-04-10 16:09:02
【问题描述】:

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

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

【问题讨论】:

  • 你试过 Keyboard.isKeyDown(int key) 吗?
  • @Orion 是的,我确实尝试过。

标签: java keyboard lwjgl keylistener


【解决方案1】:

您需要的是一个布尔标志,该标志在按下按钮时触发,在释放按钮时不触发。然后将该标志添加到移动代码之前的 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();
}

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

【讨论】:

  • 感谢这个答案,我要去测试它,如果它有效,我会接受这个答案。明天我会带着结果回来。
  • 这实际上不会让玩家在按住按钮时移动..它只会在每次按键时移动..
【解决方案2】:

虽然上述答案可行,但 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
    }

【讨论】:

    【解决方案3】:

    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。

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多