我正在开发Java游戏,而且我遇到了KeyListeners / KeyBinding问题。我基本上想要做的是暂时禁用键盘/在动画发生时不允许更多输入。此动画是通过更新数据生成的。
我目前得到的是我按下动画的按键,动画开始,我按下另一个执行其他功能的按键。它会被添加到keyboardlistener的堆栈/队列(?)中,并在第一个动画完成时触发。
我正在使用实现KeyListener的JPanel。
了解代码:
public void keyPressed(KeyEvent arg0) {
//Prevents Repeated keys
pressed.add(arg0);
if (pressed.size() == 1) {
int key = ((KeyEvent) pressed.toArray()[0]).getKeyCode();
if (key == KeyEvent.VK_ENTER) {
doSomeAnimation();
} else if (key == KeyEvent.VK_SPACE) {
doADifferentAnimation();
}
Update();
}
}
我尝试过的事情:
1)在调用动画之前,在JPanel上设置focusable(false)。然后设置focusable(true)并在完成后抓住焦点。
2)使用布尔值来跟踪动画发生的时间。
3)使用键绑定。
无论我使用什么方法,我总是遇到问题,即在动画发生时我还会从键盘输入。然后,一旦完成该动画,它将转到堆栈/队列(?)中的下一个元素并处理它。此外,这些动画需要不止一次出现(因此使用布尔数组来验证它是否已经执行已经不会有用)。
所以,如果你有任何想法或帮助(或指向我的地方),我将不胜感激。
一些额外信息:Java 1.6,IDE Eclipse,MVC结构。 (这个问题是控制器/模型)
答案 0 :(得分:1)
假设您的动画是由javax.swing.Timer
的实例驱动的,则有问题的队列是EventQueue
,game以Timer
的“排队顺序”运行事件。因为阻止主机平台上的其他设备唤起您的监听器是不切实际的,您必须跟踪应用程序中的效果。作为一个具体的例子,这个example有几个模型move()
方法的重载来处理来自不同来源的输入:键盘,鼠标或动画计时器。可以打开或关闭计时器以查看其效果。使用自定义实现取代EventQueue
的{{3}}也可以提供一些见解。