キーボードの使い方
画面上の●が矢印キーで移動できます。またXキーを押すと●の色がランダムに変化します。
キーイベント
キーボードが押されたか検出するにはまず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()というのがあります。