2016-12-04 4 views
0

JavaFX onKeyPressedイベントを使用してアクションゲームの複数キープレスの動作を再現しようとしていますが、私はすべてのウィンドウベースのキーボード入力ハンドラ 希望する動作:複数のキープレスイベントの乱用Windowsで

ユーザがWキーを検出/印刷した場合 ユーザがWキーを押したまま「R」キーを押したまま「W」を検出した場合は「R」 "が検出されました。 「R」がリリースされたときに「W」がリリースされるまで検出されるはずです。本当に何が起こるか

:さらに

WRWRWRWRWRWRWRWRWRWRWR 

Rは次のとおりです。ある

WWWWWWWWWWRRRRRRRRRRRR 

しばらくは行動を望んでいた:任意のエディタを開いて、これらのキーは、まずR W押し続ける は、それが何かのように印刷しますリリース - Wはまったく印刷されません! 今、私はJavaFxキーイベント検出を使用していますが、Windowsキーイベント検出に基づいて推測していますが、私はこれをすべてのキーを検出するための回避策がいくつかあります。それは設定の問題か、私は何かが欠けているのですか? ほとんどのコンピュータゲームで問題が解決されていることがわかります。つまり、実行キーを押して、ゲーム内で実行している不自然なキーを入力すると、

答えて

2

キーが押されるとイベントが1回だけ発生し、キーが押されている限りイベントが繰り返しトリガーされるという保証はありません。したがって、あなたは自分で押されたキーを保存しておかなければなりません。状態に応じた更新は、AnimationTimerまたは適切な遅延後にアプリケーションスレッド上で繰り返し実行される他のコードからトリガされるべきです。

例:

final Set<KeyCode> activeKeys = EnumSet.noneOf(KeyCode.class); 
final AnimationTimer updater = new AnimationTimer() { 

    @Override 
    public void handle(long now) { 
     // print all pressed keys 
     for (KeyCode code : activeKeys) { 
      System.out.println(code); 
     } 
    } 
}; 

scene.setOnKeyPressed(evt -> { 
    boolean wasEmpty = activeKeys.isEmpty(); 
    if (activeKeys.add(evt.getCode()) && wasEmpty) { 
     updater.start(); 
    } 
}); 

scene.setOnKeyReleased(evt -> { 
    if (activeKeys.remove(evt.getCode()) && activeKeys.isEmpty()) { 
     updater.stop(); 
    } 
}); 
関連する問題