人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

キーボードの使い方

画面上の●が矢印キーで移動できます。またXキーを押すと●の色がランダムに変化します。

key_test.jar

キーイベント

キーボードが押されたか検出するにはまずKeyListenerインタフェースをimplementsし登録します。これはマウスクリック(2004/10/16)の検出にMouseListenerをimplementsするのに似ています。あとJPanelがキーボードを受け付けるようにするにはsetFocusable(true)を実行しておかないとだめです。JFrameなどははじめからキーボードを受け付けるので必要ありません。

    public class MainPanel extends JPanel implements KeyListener {
        public MainPanel() {
            ・・・
            // パネルがキーボードを受け付けるようにする(必須)
            setFocusable(true);
            // キーリスナーを登録(忘れやすい)
            addKeyListener(this);
        }
    }

キーボードが反応しないなと思ったら真っ先に上の2つを確認しましょう。私もときどきaddKeyListener(this)を書き忘れます・・・

addKeyListener()の引数thisはこのクラス(MainPanel)がKeyListenerをimplementsしていることを表しています。キー処理専用のクラスを作ることも可能です。

次に下の3つのキーイベントハンドラを定義します。

    /**
     * キーがタイプされたとき呼ばれる。 文字入力を検知したい場合はこっちを使う。
     */
    public void keyTyped(KeyEvent e) {}

    /**
     * キーが押されたとき呼ばれる。 ゲームではたいていはこっちを使う。
     */
    public void keyPressed(KeyEvent e) {}

    /**
     * キーが離されたとき呼ばれる。
     */
    public void keyReleased(KeyEvent e) {}

コメントに書いてあるとおりです。ゲームではkeyPressed()を使うことが多いと思います。今回は矢印キーを押したときに●が移動するようにしたいのでkeyPressed()に処理を書きます。

    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch (key) {
            case KeyEvent.VK_UP :
                // 上キーが押されたらボールを上に移動
                ball.move(UP);
                break;
            case KeyEvent.VK_DOWN :
                // 下キーが押されたらボールを下に移動
                ball.move(DOWN);
                break;
            case KeyEvent.VK_LEFT :
                // 左キーが押されたらボールを左に移動
                ball.move(LEFT);
                break;
            case KeyEvent.VK_RIGHT :
                // 右キーが押されたらボールを右に移動
                ball.move(RIGHT);
                break;
            case KeyEvent.VK_X :
                // Xキーが押されたらボールの色を変える
                ball.changeColor();
                break;
        }
        // ボールを移動したので再描画
        // 忘れやすいので注意
        repaint();
    }

キーを押した場合、keyPressed()の引数KeyEvent eを使うことでいろんな情報が引き出せます。たとえば、getKeyCode()で押されたキーのキーコードを取得できます。キーコードはたとえば↑キーの場合はVK_UP、Xキーの場合はVK_Xなどのように定義されています。このキーコードによってどのキーが押されたか判定できます。上の例では押されたのが矢印キーの場合はその方向にボールを移動しています。Xキーの場合はボールの色を変えるメソッドを呼び出しています。

キーコードでは押されたキーの大文字小文字は判定できないことに注意してください。まあゲームで移動とかにキーボードを使うなら大文字小文字なんて関係ないでしょう。もし押されたキーの大文字小文字まで判定したい場合は代わりにgetKeyChar()というのがあります。