0

私はkeyListenerを持っているので、ついにキーボード入力の遅延を克服しました。ユーザーが「上」矢印キーを押し「上」に移動すると、必要なだけ「上」に移動し、その後、ユーザーが「下」矢印キーを押すと、(「上」矢印キー)「下」に移動します。

「下」矢印キーを離した後、「上」キーを再度押さなくても「上」に移動できるようにするにはどうすればよいですか?

(注: プロセス全体で「UP」キーを押します。)

入力をリッスンするために現在使用しているコードは次のとおりです。

private void keyListeners(){
    GlobalObjects.frame.addKeyListener(new KeyListener() {
        @Override
        public void keyPressed(KeyEvent e) {

            //Up    = 1
            //Down  = 2
            //Left  = 3
            //Right = 4

            if(e.getKeyCode() == 38){
                System.out.println("UP KEY PRESSED");
                player.setPlayerMovement(1);
            }else if(e.getKeyCode() == 40){
                System.out.println("DOWN KEY PRESSED");
                player.setPlayerMovement(2);
            }else if(e.getKeyCode() == 37){
                player.setPlayerMovement(3);
            }else if(e.getKeyCode() == 39){
                player.setPlayerMovement(4);
            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            if(e.getKeyCode() == 38){
                if(player.getPlayerMovement() != 1){
                    System.out.println("UP KEY released, but some other arrow key changed the playermovement to a different number (do nothing)");
                }else{
                    System.out.println("UP Key was a the last key pressed, therefore its safe to set player movement to "0" (not moving)");
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 40){
                if(player.getPlayerMovement() != 2){

                }else{
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 37){
                if(player.getPlayerMovement() != 3){

                }else{
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 39){
                if(player.getPlayerMovement() != 4){

                }else{
                    player.setPlayerMovement(0);
                }
            }
        }

        @Override
        public void keyTyped(KeyEvent e) {

        }
    });
}

わからない場合は、これは 2D RPG ベースのゲームです。(それがまったく役立つ場合は、質問に答えます)

4

1 に答える 1

0

私はここで同様の質問を見つけました。それはあなたの問題を解決するはずです。公式の Oracle キー イベント デモhereによると、1 つのキーを押したまま別のキーを押してから 2 つ目のキーを離すと、2 つ目のキーの解放イベントのみが生成されます。理由はわかりませんが、まさにその通りです。押されたすべてのキーを記憶し、最後に押されたキーに応答する必要があります。

EDIT:これはJAVAの問題ではないことに気付きました(少なくとも、それだけではありません)。KeyEventのドキュメントによると、KeyPressedKeyReleasedは低レベルのメソッドです。

「キーが押された」イベントと「キーが離された」イベントは低レベルであり、プラットフォームとキーボード レイアウトに依存します。

したがって、そのような動作はプラットフォームに依存する可能性があります。私の好奇心は、「実行」プロンプトでこのアクションを試してみることに導きました(はい、私はWindowsで作業しています)、何が起こったのか推測します-同じことです!矢印だけでなく文字も。たとえば、押したままにすると。「s」よりも「k」を押して離すと、「s」を押しながら「k」のようにテキストフィールド入力が終了しますsskkkkkkkkkkkk

于 2013-09-04T07:47:36.393 に答える