Java KeyListeners/KeyBinding-清除缓冲区-Java游戏开发
我正在开发一个Java游戏,我已经到了一个关键点,我在KeyListeners/KeyBinding方面遇到了问题。我主要想做的是在动画出现时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的 我现在得到的是,我按下动画的键,动画开始,然后我按下另一个键来执行其他功能。它被添加到keyboardlistener的堆栈/队列(?),并在第一个动画完成时触发 我正在使用一个实现KeyListener的JPanel 要了解代码,请执行以下操作:Java KeyListeners/KeyBinding-清除缓冲区-Java游戏开发,java,keyboard,Java,Keyboard,我正在开发一个Java游戏,我已经到了一个关键点,我在KeyListeners/KeyBinding方面遇到了问题。我主要想做的是在动画出现时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的 我现在得到的是,我按下动画的键,动画开始,然后我按下另一个键来执行其他功能。它被添加到keyboardlistener的堆栈/队列(?),并在第一个动画完成时触发 我正在使用一个实现KeyListener的JPanel 要了解代码,请执行以下操作: public void keyPresse
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上设置可聚焦(false)。然后设置可聚焦(true)并在完成后获取焦点
2) 使用布尔值跟踪动画发生的时间
3) 使用键绑定
无论我使用什么方法,我总是会遇到这样的问题:当动画发生时,我仍然会从键盘接收输入。然后,一旦动画完成,它将转到堆栈/队列(?)中的下一个元素并处理该元素。此外,这些动画需要多次出现(因此,使用一组布尔值来验证是否已经执行了动画是没有帮助的)
因此,如果你有任何想法或帮助(或地方指给我),将不胜感激
一些额外的信息:Java1.6、IDEEclipse、MVC结构。(这里讨论的是控制器/模型)假设您的动画由的实例驱动,这里讨论的队列是,它按照计时器的“排队顺序”运行事件。因为阻止主机平台上的其他设备唤起您的侦听器是不切实际的,所以您必须在应用程序中跟踪效果。作为一个具体的例子,这有几个重载模型的
move()
方法来处理来自不同来源的输入:键盘、鼠标或动画计时器。可以打开或关闭计时器以查看其效果。这可以用自定义实现取代事件队列
,也可以提供一些见解。假设动画是由的实例驱动的,所讨论的队列是,该队列通过计时器以“与事件排队相同的顺序”运行事件。因为阻止主机平台上的其他设备唤起您的侦听器是不切实际的,所以您必须在应用程序中跟踪效果。作为一个具体的例子,这有几个重载模型的move()
方法来处理来自不同来源的输入:键盘、鼠标或动画计时器。可以打开或关闭计时器以查看其效果。这用自定义实现取代了EventQueue
,也提供了一些见解。@mKorbel:Good observation;突出了不使用计时器时通常会出现的复杂性。我没有使用计时器,但感谢您的帮助。您提供的链接非常有用。:)我通过混合使用替换eventqueue和设置focusable解决了这个问题。@mKorbel:观察效果很好;突出了不使用计时器时通常会出现的复杂性。我没有使用计时器,但感谢您的帮助。您提供的链接非常有用。:)我通过混合使用替换eventqueue和设置focusable解决了这个问题。