我有一个名为 Keyboard
的 KeyListener
类,它实现了 KeyListener
的方法。
按键可以有 4 个状态(UP、ISUP、DOWN、ISDOWN
),所有状态都表示它们是否处于关闭状态,或者刚刚处于关闭状态。
在每次更新键盘
之前,我想将所有UP
更改为ISUPS
和DOWN
s 到 ISDOWN
s。
Keyboard 类上有一个 Update
方法,但我不知道何时调用它(因为 addKeyListener()
函数似乎很神奇,只是无需调用任何函数即可工作[可能启动一个线程])
我如何知道何时调用 Update
方法? (就在键盘
即将触发事件之前)
这是 Keyboard
类本身:
package game.input;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Map;
enum KeyStatus
{
DOWN, ISDOWN, UP, ISUP
}
public class Keyboard implements KeyListener
{
private Map<Character, KeyStatus> keys;
public Keyboard()
{
keys = new HashMap<Character, KeyStatus>();
for (int i = 0; i < 256; i++)
{
keys.put((char)i, KeyStatus.ISUP);
}
}
public void update() //This should be called after every event loop (how?)
{
for (Map.Entry<Character, KeyStatus> ks: keys.entrySet())
{
if (ks.getValue() == KeyStatus.UP)
keys.put(ks.getKey(), KeyStatus.ISUP);
else if (ks.getValue() == KeyStatus.DOWN)
keys.put(ks.getKey(), KeyStatus.ISDOWN);
}
}
public boolean keyDown(char i)
{
return (keys.get(i) == KeyStatus.DOWN || keys.get(i) == KeyStatus.ISDOWN);
}
public boolean onKeyDown(char i)
{
return (keys.get(i) == KeyStatus.DOWN);
}
public boolean keyUp(char i)
{
return (keys.get(i) == KeyStatus.UP || keys.get(i) == KeyStatus.ISUP);
}
public boolean onKeyUp(char i)
{
return (keys.get(i) == KeyStatus.UP);
}
@Override
public void keyPressed(KeyEvent key)
{
keys.put(key.getKeyChar(), KeyStatus.DOWN);
}
@Override
public void keyReleased(KeyEvent key)
{
keys.put(key.getKeyChar(), KeyStatus.UP);
}
@Override
public void keyTyped(KeyEvent key)
{
}
}
最佳答案
KeyListener
注册到组件,当某种 KeyEvent
发生时,EventQueue
会通知该组件。 EventQueue
通过直接与操作系统/ native 层绑定(bind)的特定于平台的机制进行通知。
Swing 通常使用 observer pattern当谈到听众时。也就是说,您将一个监听器附加到一个组件,该组件会在发生某些情况时告诉您
您不应该“需要”调用任何方法来检查按键的状态。相反,当触发 KeyEvent
时,KeyListener
将收到通知(通过事件链)并通过 KeyListener
接口(interface)触发适当的事件。
KeyListener
需要向屏幕上可见的某个组件注册,可以获得键盘焦点并在事件发生时具有焦点。
看看How to write Key Listeners了解更多详情。
您还可以找到Introduction to Event Listeners有用。
KeyListener
遇到焦点问题(只有当前可聚焦/聚焦的组件才能接收 KeyEvents
)。建议您使用Key Bindings相反。
已更新
经过一轮轮的讨论,我们找出了真正的问题是什么,我们得出的结论是,OP 正在尝试生成当前按下但已由游戏引擎处理的按键的屏蔽列表,以努力消除按键重复触发更多更新。
我们得出的结论是,OP 应该生成一个“已处理”且“Activity ”的 key 列表。
当触发按键事件时,键盘处理程序将检查该键是否存在于“已处理”列表中,如果存在,则忽略该键,否则将其放入 Activity 列表中。
当游戏引擎处理按键时,它会扫描“Activity ”列表,采取操作并将每个按键放在“已处理”列表中。
释放 key 后,它将从已处理列表中删除。
关于Java KeyListener "object update",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430088/