我正在尝试创建一个蛇游戏,在其中我使用箭头键或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()的持续时间?
答案 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);
然后,当标志numTicksHeld
为acceptedKeyPressed
时,使用某种true
变量跟踪时间。
在每个刻度上检查acceptedKeyPressed
是否为真。当numTicksHeld
为acceptedKeyPressed
时,将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)
}
}