私は別の質問のコメントセクションでこれを尋ねました(> 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)変数を介して2番目のチェックを追加するまで、ピラミッドが作成したものは膨大でした。その2番目のチェックを行っても、リストは大きくなり、ほとんどの場合、2〜3個の重複があります。私のキャラクターがぎこちなく動いているので、これに関するどんな助けも素晴らしいでしょう。:(
また、char、string、arrayListへの重複した変換を削除する方法はどれも素晴らしいでしょう。私は緊張しているので、「単純な」ものにあまりにも多くの型を使用しました。