キャラを動かしたい。それがゲームやん。
マウスとキーボードを使ったキャラの動かし方を探ってみる。
キャラは今回は単純に円にしてみた。
Java はマウス動作やキー入力をイベントとして監視し、イベント発生時にクラスに通知するようや。 イベント・ドリブン(駆動型)やね。VisualBasic と感じは同じか? GUIのプログラミングの基本やね。
Java イベントを監視しとるのが Listener と呼ばれてる。で、Listener を使ってみた。行ってみよ。
まず、マウスのドラッグで円を動かしてみる。
マウスのイベントを監視してる Listener は、 MouseListener と MouseMosionListener があった。 共に java.awt.event パッケージのインターフェイス(サブクラスって言っても良いか?)になってる。
MouseListener はクリックとかコンポーネント(アプレット領域の中とか)に入ったり出たりするイベントを受け取る。
MouseMosionListener はドラッグとかマウスの移動のイベントを受け取る。
今回はドラッグで円を動かしたいけん MouseMosionListener を使うことにする。
コードはこんなの書いた。コメント書いとるけん、詳細は省く。import java.applet.Applet; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; public class MouseGuruGuru1 extends Applet implements MouseMotionListener { int x, y; // マウスの(x,y)座標 public void init() { x = 150; y = 50; addMouseMotionListener(this); // MotionListener を登録 } public void paint( Graphics g ) { g.fillOval(x-10, y-10, 20, 20); // 円を書く } public void mouseDragged( MouseEvent evt ){ // マウス・ドラッグのイベント発生時に呼ばれる x = evt.getX(); y = evt.getY(); repaint(); } public void mouseMoved( MouseEvent evt ){} // マウス・移動のイベント発生時に呼ばれる }
java.awt.event.MouseEvent クラスの addMouseMotionListener メソッドで this このアプレット(MouseGuruGuru1クラス)を監視されるコンポーネントとして登録。
MouseMotionListener インターフェースの mouseDragged メソッドに ドラッグされた時のお仕事を書く。
マウスの(x,y)座標を拾ってくるのは MouseEvent クラスの getX() と getY() メソッドを使うとよか。
mouseMoved メソッドは使わんでも記述しとらんとエラーになったけん注意。
結果はこうなる。アプレット領域内をドラッグしてみそ。円が動くけん
うまくいったね。
お次はカーソルキーを使ってみる。
キーボードのイベントを拾ってくるのは KeyListener を使えばよか。
マウスでドラッグと同じ要領でこんなコード書いてみた。java.awt.event.KeyEvent クラスの addKeyListener メソッドで this このアプレット(KeyGuruGuru1クラス)を監視されるコンポーネントとして登録。import java.applet.Applet; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyGuruGuru1 extends Applet implements KeyListener { int x, y; // 円の中心(x,y)座標 public void init() { x = 150; y = 50; addKeyListener(this); // KeyListener を登録 } public void paint( Graphics g ) { g.fillOval(x-10, y-10, 20, 20); } public void keyPressed(KeyEvent evt) { // Keyを押している時 switch(evt.getKeyCode()) { // Keyコードによる場合分け case KeyEvent.VK_UP: // カーソル↑ y -= 2; break; case KeyEvent.VK_DOWN: // カーソル↓ y += 2; break; case KeyEent.VK_RIGHT: // カーソル→ x += 2; break; case KeyEvent.VK_LEFT: // カーソル← x -= 2; break; default: break; } repaint(); } public void keyReleased(KeyEvent evt) {} // Keyを離した時 public void keyTyped(KeyEvent evt) {} // Keyを押した時 }
KeyListener インターフェースの keyPressed メソッドに キーが押された時のお仕事を書く。
KeyEvent クラスの getKeyCode() メソッドを使うと押されてるキーの種類を拾ってこれる。 どの種類のキーが拾われたかは KeyEvent.VK_UP とかのフィールド変数(クラス変数あるいは定数?)を使って場合分けした。
keyReleased と keyTyped は 使わんけど書いとかなエラーになった。
結果。アプレット領域をマウスでクリックした後、カーソルを押してみそ。円が動くけん。
やれやれ。クラスとメソッドのお勉強にもなったな。
('02.02.26)