【发布时间】:2013-04-29 15:22:56
【问题描述】:
好的,我正在为学校制作一个 2D 横向卷轴游戏。这很像马里奥(嗯,这是我完成后的希望。)当我按右箭头键沿地图移动我的玩家时,他移动一次,暂停,然后开始平稳移动很多。我认为这是因为当你按住一个键时所有苹果笔记本电脑都会暂停,但我不知道如何为我的游戏解决这个问题。有什么建议吗?谢谢你。
【问题讨论】:
-
@syb0rg:是的,该解决方案使用键绑定和 Swing Timer。
好的,我正在为学校制作一个 2D 横向卷轴游戏。这很像马里奥(嗯,这是我完成后的希望。)当我按右箭头键沿地图移动我的玩家时,他移动一次,暂停,然后开始平稳移动很多。我认为这是因为当你按住一个键时所有苹果笔记本电脑都会暂停,但我不知道如何为我的游戏解决这个问题。有什么建议吗?谢谢你。
【问题讨论】:
一种解决方案是在 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;
【讨论】:
虽然你没有发送任何代码 sn-p 我可以假设以下。我认为你已经实现了按键监听器,当按键被按下时会做一些事情。如果用户仍然按下该键,您的程序会在延迟一段时间后获取第二个事件,然后开始更快地获取事件。
这不是你需要的。您可能应该持有某种应用程序状态keyIsPressed,该状态仅在第一次按下(未按下)键时更改一次。然后仅在按键启动时关闭此变量。当键关闭时,第一次启动移动对象的后台线程并定期检查标志keyIsPressed 以了解何时停止。
祝你成为马里奥的竞争对手...... :)
【讨论】:
【讨论】:
所有 KeyEvent 都是整数,因此您可以设置 boolean[] 来存储 KeyEvent 中的所有更改。对于 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()。
【讨论】: