我已经实现了一个游戏,玩家可以在基于拼图的迷宫中移动精灵。玩家使用箭头键控制精灵。我想要的是限制玩家可以移动的速度,例如我不希望他们能够按住箭头键并飞过屏幕。我尝试通过实现睡眠来解决这个问题:
switch (keyCode) {
case KeyEvent.VK_UP: // Up arrow key
if (running) {
player.Move(1); // Move North
}
paintPlayer(getGraphics());
// So the player can't hold down the arrow key and fly across the screen, force them to wait between inputs
// BUT this leads to problems if you do hold it down, moves end up in a 'queue'...
try {
Thread.sleep(150);
break;
} catch (InterruptedException ex) {
Logger.getLogger(MazeView.class.getName()).log(Level.SEVERE, null, ex);
}
break;
// etc.
但如果按住箭头键,这会导致问题 - 这些动作似乎最终会出现在某种“排队”中#34;并且你最终会不断撞到墙上,直到你的扩展按键完成所有动作。有没有更好的方法呢?
答案 0 :(得分:0)
以前我正在做一个keyPressed()事件,但正如Riyafa建议的那样,我把它更改为仅在keyReleased()上触发,并且就完成了它。也不需要再包括睡眠了。
答案 1 :(得分:0)
我建议调查Switng Timer。顾名思义,它的动作是在与Key事件监听器和所有其他GUI内容相同的线程中执行的,因此您可以根据键/按钮状态轻松地在那里绘画并更新游戏状态。如果您正在等待另一个线程,您也可以使用swingutilities.invokelater(new runnable()
。我没有做Swing很长一段时间而忘记了一切,但我确信这就是动态游戏应该如何完成。