好的,所以我正在为学校制作2D侧卷轴游戏。它几乎就像马里奥(嗯,这是我完成时的希望。)当我按下右箭头键将我的玩家沿着地图移动时,他移动一次,暂停,然后开始平稳地移动很多。我认为这是因为当你按住键时所有苹果笔记本电脑都会暂停,但我不知道如何为我的游戏解决这个问题。有什么建议?谢谢。
答案 0 :(得分:1)
一种解决方案是在keypressed方法中设置boolean keyUP = true
,在keyreleased方法中设置keyUP = false
。这样一旦按下了键,你的游戏就会将其注册为"keep moving up"
,直到你释放键,而不是"Up was pressed move up, up was pressed move up....".
这样就消除了输入时的初始延迟(在linux上非常明显)。
从我们的游戏:
private boolean up, down, left, right;
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = false;
break;
case KeyEvent.VK_W:
up = false;
break;
case KeyEvent.VK_A:
left = false;
break;
case KeyEvent.VK_D:
right = false;
break;
}
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = true;
break;
case KeyEvent.VK_W:
up = true;
break;
case KeyEvent.VK_A:
left = true;
break;
case KeyEvent.VK_D:
right = true;
break;
答案 1 :(得分:1)
虽然您尚未发送任何代码段,但我可以假设以下内容。我认为你已经实现了在按下键时执行某些操作的键监听器。如果用户仍然按下该键,则程序会在一段延迟后获得第二个事件,然后开始更快地获取事件。
这不是你需要的。您可能应该保留某种应用程序状态keyIsPressed
,该状态仅在第一次按下(未按下)键时才更改一次。然后仅在按键启用时关闭此变量。当键第一次关闭时,启动移动对象的后台线程并定期检查标志keyIsPressed
以知道何时停止。
祝你好运成为马里奥的竞争者......:)
答案 2 :(得分:0)
答案 3 :(得分:0)
所有关键事件都是整数,因此您可以使用boolean []来存储关键事件中的所有更改。对于Java2d我使用这样的东西:
import java.awt.KeyEventDispatcher;
import java.awt.event.KeyEvent;
public final class Keyboard implements KeyEventDispatcher {
public static boolean[] keyPressed = new boolean[256];
public static boolean[] keyHold = new boolean[256];
public static boolean[] keyReleased = new boolean[256];
public static void update() {
for (int i=0; i<128; i++) {
keyPressed[i] = false;
keyReleased[i] = false;
}
}
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID()==KeyEvent.KEY_PRESSED) {
keyHold[e.getKeyCode()] = true;
keyPressed[e.getKeyCode()] = true;
}
else if (e.getID()==KeyEvent.KEY_RELEASED) {
keyHold[e.getKeyCode()] = false;
keyReleased[e.getKeyCode()] = true;
}
return false;
}
}
我在每帧之后调用update()。