Scene Builderでキー同時押しを判定したい

Scene Builedrでキー入力処理を作っていたので

備忘録もかねて書いておく。

SceneBuilderでキー入力を判定するメソッド

Scene Builderでは以下の2つが対象になる。

  • setOnKeyPressed キー押下~キーを話す直前までの操作。
    つまり、押しっぱなしの際もこのメソッドで判定される。
  • setOnKeyReleased キーを離した瞬間の操作。

単体キー押下は色んな参考サイトがある。

下記のサイトを参考にしながら、キー入力操作を見よう見まねで作っていた。

nompor.com

lovedvoraklayout.hatenablog.com

https://itech-program.com/java/1233

しかし、同時押しについてはほとんど情報がなく途方に暮れていた。

どちらもキー入力があった場合に同時押しと判定する。

やり方がどうしてもわからないので、以下のようにした。

  1. どのキーが押されたかを判定し、押されたキーに対してフラグをつける。

  2. TRUEになったフラグが2つあった場合は、同時押しと判定して処理をする。

  3. 単体キーは同時押し以外の条件として処理する。こうしないと、同時押し+単体キーの入力判定になってしまうため。

とりあえずこれで「同時押し」の判定はできるようになった。

下記は上キーとWキーの同時押しを判定したものである。

scene.setOnKeyPressed(new EventHandler<KeyEvent>()
{
    @Override
    public void handle(KeyEvent e)
    {
        if(e.getCode() == KeyCode.UP)
        {
            upFlg = true;
        }
        if(e.getCode() == KeyCode.W)
        {
            wFlg = true;
        }
        
        //同時押しと判定する
        if(upFlg && wFlg)
        {
            System.out.println("同時押し");
        }
        else
        {
            if(upFlg)
            {
                System.out.println("↑");
            }
            if(wFlg)
            {
                System.out.println("w");
            }
        }
    }
});

しっかしひどいプログラムコードしてんな初心者か

同時押しするときの問題

しかし上記の方法には問題がある。

最初に同時押しをした場合、↑かWどちらかのキー判定と同時押しのキー判定が起きる。

この現象はキーボードの仕様なのか、プログラムの欠陥なのかまだわかっていない。

現状大きな問題ではないので、特に解決する気はない。

余裕があったら一度調べてみようと思う。

あのあと調べてみたらこのコードで問題なく動いた。 うーん何だったのだろう( ˙-˙ )