我正在开发Java游戏,现在我遇到了KeyListeners / KeyBinding问题。我基本上想做的是在发生动画时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的。
我现在得到的是,我按下了动画的键,动画开始了,然后我按下了执行其他功能的另一个键。它被添加到键盘监听器的堆栈/队列(?)中,并在第一个动画结束时触发。
我正在使用实现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结构。 (有问题的是控制器/模型)
最佳答案
假设动画是由javax.swing.Timer
实例驱动的,则所讨论的队列是EventQueue
,该队列以Timer
排队的顺序运行事件。因为阻止主机平台上的其他设备引起监听器是不切实际的,所以您必须在应用程序中跟踪效果。作为具体示例,此game具有模型的move()
方法的一些重载,以处理来自不同来源(键盘,鼠标或动画计时器)的输入。可以打开或关闭计时器以查看其效果。该example通过自定义实现代替EventQueue
,也可能提供一些见识。