如何获得onKeyPressed持续时间?

时间:2019-09-07 15:53:02

标签: java javafx

我正在尝试创建一个蛇游戏,在其中我使用箭头键或WASD移动蛇。 最初,蛇是慢的,以2 fps的速度移动(就像经典的蛇游戏一样),我希望当我按住其中一个键时将蛇移动得更快,并在释放它时将其设置为原始速度。

我试图像这样改变onKeyPressed内部的移动速度:

scene.setOnKeyPressed(event -> {input = event.getCode().toString();
            for (String acceptedKey : acceptedKeys) {
                if (event.getCode().toString().contains(acceptedKey)) {
                    movement.setRate(4);
                    break;
                }
            }
        });

然后在我释放它时将其更改为正常速率:

scene.setOnKeyReleased(event -> movement.setRate(1));

*动作是一个时间轴,从游戏开始到蛇的停止或死亡都开始。

代码按我的预期工作,但是每次我按下一个键,它都会加速一个周期,然后放慢速度。 我希望仅当我按住键一定时间(例如400毫秒)时才改变速度,所以有没有办法放置if语句来检查onKeypressed()的持续时间?

1 个答案:

答案 0 :(得分:1)

设置一个布尔标志,而不是在侦听器中处理这种复杂的逻辑,当按下某个键时,该布尔标志将打开。

scene.setOnKeyPressed(event -> {input = event.getCode().toString();
            for (String acceptedKey : acceptedKeys) {
                if (event.getCode().toString().contains(acceptedKey)) {
                    acceptedKeyBeingPressed = true;
                    break;
                }
            }
        });
scene.setOnKeyReleased(event -> acceptedKeyBeingPressed = false);

然后,当标志numTicksHeldacceptedKeyPressed时,使用某种true变量跟踪时间。

在每个刻度上检查acceptedKeyPressed是否为真。当numTicksHeldacceptedKeyPressed时,将false变量重置为0。如果为true,则增加1。如果numTicksHeld高于某个阈值,则movement.setRate(4)

我不知道您的框架中的tick / update方法是什么样子,但可能是这样的:

public void tick() {
    if(acceptedKeyPressed) {
        numTicksHeld++;
        if(numTicksHeld > KEY_HELD_THRESHOLD)
            movement.setRate(4)
    } else {
        numTicksHeld = 0;
        movement.setRate(1)
    }
}