我在另一个问题的评论部分提出了这个问题(>如何在 Java 中处理同时按下的按键?),并被要求完全提出一个新问题。
我的问题是,当我创建按键的 ArrayList 时,如果用户按住按键,它们不会通过 keyReleased 事件足够快地删除。我希望运动与“asdf”和北,东,南,西,东北......等一起。
这是我的两个事件的代码:
@Override
public void keyPressed(KeyEvent e) {
if(chatTextField.isFocusOwner() == true){
//do nothing - don't walk
} else {
logger.debug("Key Pressed: " + e.getKeyChar());
lastKey = keysPressed.get(keysPressed.size()-1);
for (String key : keysPressed){
if (!key.contains(String.valueOf(e.getKeyChar())) && !lastKey.contains(String.valueOf(e.getKeyChar()))){
keysPressed.add(String.valueOf(e.getKeyChar()));
System.out.println("ADDED: " + keysPressed);
}
}
String keysList = keysPressed.toString();
if (keysList.contains("w")){
if (keysList.contains("d")){
requestCharacterMove("NorthEast");
} else if(keysList.contains("a")){
requestCharacterMove("NorthWest");
} else{
requestCharacterMove("North");
}
} else if (keysList.contains("s")){
if (keysList.contains("d")){
requestCharacterMove("SouthEast");
} else if(keysList.contains("a")){
requestCharacterMove("SouthWest");
} else{
requestCharacterMove("South");
}
} else if (keysList.contains("d")){
requestCharacterMove("East");
} else if (keysList.contains("a")){
requestCharacterMove("West");
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if(chatTextField.isFocusOwner() == true){
//do nothing - don't walk
} else {
logger.debug("Key Released: " + e.getKeyChar());
for (String key : keysPressed){
if (key.contains(String.valueOf(e.getKeyChar()))){
keysPressed.remove(String.valueOf(e.getKeyChar()));
System.out.println("REMOVED: " + keysPressed);
}
}
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
直到我通过 lastKey(String) 变量在那里添加第二次检查,金字塔创建的规模是巨大的。即使进行第二次检查,列表也会增加,并且几乎总是有两到三个重复项。由于我的角色笨拙地移动,因此对此的任何帮助都会很棒。:(
此外,任何删除对 char、string、arrayList 的重复转换的方法都会很棒,因为我很紧张我为“简单”的东西使用了太多类型。