程序如何同时允许多个键盘输入?
How have a program allow multiple keyboard inputs simultaneously?
我正在写一个简单的游戏,基本上有两个人控制精灵和战斗。我用一个关键的监听器编写了这个程序,但这只允许我在任何给定时间控制一个精灵。除了 KeyListener
,我愿意使用不同的键盘输入方法,尽管我更愿意坚持使用 KeyListener
。我听说过 KeyBindings
,但我真的不知道如何使用它们。我有一个想法是多线程,但我对这个概念不太满意。这是我的代码:(请举例说明我的代码应该是什么。另外,第二个精灵是用一个单独的 class 控制的,它与这个几乎相同,只是使用了不同的键。)
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
public class KeyHandler implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP) {
Display.up = Display.up + 7;
}
if (key == KeyEvent.VK_DOWN) {
Display.down = Display.down + 7;
}
if (key == KeyEvent.VK_RIGHT) {
Display.right = Display.right + 7;
}
if (key == KeyEvent.VK_LEFT) {
Display.left = Display.left + 7;
}
if (key == KeyEvent.VK_SPACE) {
Display.fireMissile();
Display.whichSpriteInt = 0;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Currently its not controlling an object, its just painting a buffered image then changing the coordinates with the key input
因此,您在生成 KeyEvent 时执行操作。
键绑定的工作方式没有什么不同。您将 Action 映射到 KeyStroke。它不会改变您编写代码的方式,只会改变您处理事件的方式。
查看 Motion Using the Keyboard。前两个示例(一个使用 KeyListener,另一个使用 Key Binding)演示了这个概念。两个 class 都定义了一个相同的 move(...)
方法,唯一的区别是如何调用该方法。
I could change the format but it would require a lot of code reworking and I'd prefer to avoid it.
现在是学习如何改进 structure/design 程序的最佳时机。 Swing 是围绕创建动作的概念设计的,因此可以通过键盘或鼠标调用动作。
话说你真的很想看看KeyboardAnimation.java
例子。 class 完全符合您的要求。它使用 Timer 来制作动画,并允许不同的 KeyStrokes 移动不同的对象。
我正在写一个简单的游戏,基本上有两个人控制精灵和战斗。我用一个关键的监听器编写了这个程序,但这只允许我在任何给定时间控制一个精灵。除了 KeyListener
,我愿意使用不同的键盘输入方法,尽管我更愿意坚持使用 KeyListener
。我听说过 KeyBindings
,但我真的不知道如何使用它们。我有一个想法是多线程,但我对这个概念不太满意。这是我的代码:(请举例说明我的代码应该是什么。另外,第二个精灵是用一个单独的 class 控制的,它与这个几乎相同,只是使用了不同的键。)
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
public class KeyHandler implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP) {
Display.up = Display.up + 7;
}
if (key == KeyEvent.VK_DOWN) {
Display.down = Display.down + 7;
}
if (key == KeyEvent.VK_RIGHT) {
Display.right = Display.right + 7;
}
if (key == KeyEvent.VK_LEFT) {
Display.left = Display.left + 7;
}
if (key == KeyEvent.VK_SPACE) {
Display.fireMissile();
Display.whichSpriteInt = 0;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Currently its not controlling an object, its just painting a buffered image then changing the coordinates with the key input
因此,您在生成 KeyEvent 时执行操作。
键绑定的工作方式没有什么不同。您将 Action 映射到 KeyStroke。它不会改变您编写代码的方式,只会改变您处理事件的方式。
查看 Motion Using the Keyboard。前两个示例(一个使用 KeyListener,另一个使用 Key Binding)演示了这个概念。两个 class 都定义了一个相同的 move(...)
方法,唯一的区别是如何调用该方法。
I could change the format but it would require a lot of code reworking and I'd prefer to avoid it.
现在是学习如何改进 structure/design 程序的最佳时机。 Swing 是围绕创建动作的概念设计的,因此可以通过键盘或鼠标调用动作。
话说你真的很想看看KeyboardAnimation.java
例子。 class 完全符合您的要求。它使用 Timer 来制作动画,并允许不同的 KeyStrokes 移动不同的对象。