我有一个名为KeyListener
的Keyboard
类,该类实现了KeyListener
的方法。
键具有四个状态键(UP, ISUP, DOWN, ISDOWN
),它们分别表示它们是否已关闭或刚刚关闭。
在每次更新Keyboard
之前,我想将所有UP
更改为ISUPS
,将DOWN
更改为ISDOWN
。
Keyboard类上有一个Update
方法,但我不知道何时调用它(因为addKeyListener()
函数似乎很神奇,并且无需调用任何函数即可工作[可能启动线程])
我怎么知道何时调用Update
方法? (在Keyboard
即将触发事件之前)
这是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
被注册到组件,当某种EventQueue
出现时,KeyEvent
会通知该组件。 EventQueue
由特定于平台的机制通知,该机制直接绑定到OS /本机层。
对于侦听器,Swing通常使用observer pattern。也就是说,您将侦听器附加到组件,该组件将在发生某些情况时告诉您
您不应该“需要”调用任何方法来检查键的状态。相反,当触发KeyEvent
时,将通过事件链通知KeyListener
,并通过KeyListener
接口触发适当的事件。KeyListener
需要注册一些在屏幕上可见的组件,可以获取键盘焦点并在事件发生时具有焦点。
有关更多详细信息,请参见How to write Key Listeners。
您可能还会发现Introduction to Event Listeners有用。KeyListener
存在焦点问题(仅当前可聚焦/聚焦的组件可以接收KeyEvents
)。建议您改用Key Bindings。
更新
经过一番讨论,我们找出了真正的问题所在,然后得出结论,OP正在尝试生成当前按下但由游戏引擎处理过的按键的屏蔽列表,以消除这种情况。触发更多更新的键重复。
我们得出的结论是,OP应该生成一个“已处理”和“活动”密钥列表。
触发按键事件时,键盘处理程序将检查该键是否在“已处理”列表中,如果存在,则忽略该键,否则将其置于活动列表中。
当游戏引擎处理这些键时,它会扫描“活动”列表,并采取措施并将每个键放在“已处理”列表上。
释放密钥后,会将其从已处理列表中删除。
关于java - Java KeyListener“对象更新”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16430088/