好的,所以我正在为学校制作一个 2D 横向卷轴游戏。这很像马里奥(嗯,这是我完成后的希望。)当我按右箭头键沿地图移动我的玩家时,他移动了一次,暂停,然后开始平稳地移动很多。我认为这是因为当你按住一个键时所有苹果笔记本电脑都会暂停,但我不知道如何为我的游戏解决这个问题。有什么建议吗?谢谢你。
问问题
4132 次
4 回答
1
一种解决方案是在 keypressed 方法boolean keyUP = true
和keyUP = false
keyreleased 方法内部进行设置。这样,一旦按下键,您的游戏就会将"keep moving up"
其注册为直到您释放键,而不是"Up was pressed move up, up was pressed move up....".
This 消除输入时的初始滞后(在 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;
于 2013-05-05T21:14:22.487 回答
1
尽管您没有发送任何代码片段,但我可以假设以下内容。我认为你已经实现了按键监听器,当按键被按下时会做一些事情。如果用户仍然按下该键,您的程序会在延迟一段时间后获取第二个事件,然后开始更快地获取事件。
这不是你需要的。您可能应该保持某种应用程序状态keyIsPressed
,该状态仅在第一次按下(未按下)键时更改一次。然后仅在按键启动时关闭此变量。当键关闭时,第一次启动移动对象并定期检查标志keyIsPressed
以知道何时停止的后台线程。
祝你好运成为马里奥的竞争对手...... :)
于 2013-05-05T21:14:59.880 回答
0
- 如果这是 Swing GUI,则使用键绑定,而不是键侦听器,
- 在按键时启动摆动计时器
- 并在按键释放时停止。
于 2013-05-05T21:23:42.593 回答
0
所有 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() 。
于 2013-05-05T21:25:36.663 回答