Java 从关键侦听器获取同步输入
Java get simultaneos input from key listener
我正在创建一个简单的游戏,其中按键事件在 JPanel
中移动 JLabel
一定数量的像素。
它没有任何错误,当我点击右箭头时它向右移动,等等。但是,一旦我按下第二个键,它就会中断原来的运动。
例如,如果我按住左键(对象向左移动)然后我按下向上箭头,对象停止向左移动。这(当然)是因为我只对我的所有密钥使用了一个密钥事件。
这显然是不可接受的情况,因为一旦我添加第二个对象(对于另一个玩家),每个玩家都会不断地停止其他玩家的移动。
所以我的问题是:我怎样才能最好地合并多个同时进行的关键操作? (最好不要写几十个KeyAdapter
和KeyEvent
)
信息:目前我有第二个 class 扩展 KeyAdapter
。第二个 class 包含一个 KeyPressed
函数,然后使用 .getKeyCode();
找出哪个键被按下并执行。
编辑:欢迎提出任何建议!
解决方法其实很简单。当注册按键事件时,存储一个记录移动的变量。注册释放键事件后,取消存储该变量。
这意味着在您释放按键之前,运动将继续被记录。该解决方案还需要一个计时器,以便重复循环并检查您的事件是否为 运行。您可以使用 delay
,但单独的 thread
对此类任务最有效。
首先你需要一个可以存储你的动作的全局变量:
String action = "";
然后你需要一个关键的监听器来记录你的输入和你停止输入的时间:
// create key listener
addKeyListener(new KeyListener()
{
@Override
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
String event = KeyEvent.getKeyText(keyCode);
if (event.equals("A")) {
// DO YOUR EVENT IF THE KEY HAS BEEN PRESSED
action = "A";
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
String event = KeyEvent.getKeyText(keyCode);
if (event.equals("A")) {
// STOP DOING YOUR EVENT
action = "";
}
}
});
最后,您需要一个计时器线程来循环执行您的操作:
// CREATE A TIMER THREAD
Timer timer = new Timer();
timer.schedule(new TimerTask() {
// this is what happens every time the timer runs
@Override
public void run() {
// check if your action should be preformed
if (action.equals("A")) {
// ... do something
}
}
}, 0, 1000); // 1000 MILLESECONDS = 1 SECOND
// note: you will need to run 'timer.cancel();' at some point to end your timer
这些其他主题也值得一看,包括关于 keylistener is games. And about timer tasks。
我正在创建一个简单的游戏,其中按键事件在 JPanel
中移动 JLabel
一定数量的像素。
它没有任何错误,当我点击右箭头时它向右移动,等等。但是,一旦我按下第二个键,它就会中断原来的运动。
例如,如果我按住左键(对象向左移动)然后我按下向上箭头,对象停止向左移动。这(当然)是因为我只对我的所有密钥使用了一个密钥事件。
这显然是不可接受的情况,因为一旦我添加第二个对象(对于另一个玩家),每个玩家都会不断地停止其他玩家的移动。
所以我的问题是:我怎样才能最好地合并多个同时进行的关键操作? (最好不要写几十个KeyAdapter
和KeyEvent
)
信息:目前我有第二个 class 扩展 KeyAdapter
。第二个 class 包含一个 KeyPressed
函数,然后使用 .getKeyCode();
找出哪个键被按下并执行。
编辑:欢迎提出任何建议!
解决方法其实很简单。当注册按键事件时,存储一个记录移动的变量。注册释放键事件后,取消存储该变量。
这意味着在您释放按键之前,运动将继续被记录。该解决方案还需要一个计时器,以便重复循环并检查您的事件是否为 运行。您可以使用 delay
,但单独的 thread
对此类任务最有效。
首先你需要一个可以存储你的动作的全局变量:
String action = "";
然后你需要一个关键的监听器来记录你的输入和你停止输入的时间:
// create key listener
addKeyListener(new KeyListener()
{
@Override
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
String event = KeyEvent.getKeyText(keyCode);
if (event.equals("A")) {
// DO YOUR EVENT IF THE KEY HAS BEEN PRESSED
action = "A";
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
String event = KeyEvent.getKeyText(keyCode);
if (event.equals("A")) {
// STOP DOING YOUR EVENT
action = "";
}
}
});
最后,您需要一个计时器线程来循环执行您的操作:
// CREATE A TIMER THREAD
Timer timer = new Timer();
timer.schedule(new TimerTask() {
// this is what happens every time the timer runs
@Override
public void run() {
// check if your action should be preformed
if (action.equals("A")) {
// ... do something
}
}
}, 0, 1000); // 1000 MILLESECONDS = 1 SECOND
// note: you will need to run 'timer.cancel();' at some point to end your timer
这些其他主题也值得一看,包括关于 keylistener is games. And about timer tasks。