第3回:マウス&キーでぐるぐる


円を動かしてみる

キャラを動かしたい。それがゲームやん。
マウスとキーボードを使ったキャラの動かし方を探ってみる。
キャラは今回は単純に円にしてみた。
Java はマウス動作やキー入力をイベントとして監視し、イベント発生時にクラスに通知するようや。 イベント・ドリブン(駆動型)やね。VisualBasic と感じは同じか? GUIのプログラミングの基本やね。
Java イベントを監視しとるのが Listener と呼ばれてる。で、Listener を使ってみた。行ってみよ。

マウス・ドラッグで動かしてみる

まず、マウスのドラッグで円を動かしてみる。
マウスのイベントを監視してる Listener は、 MouseListenerMouseMosionListener があった。 共に 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 を使えばよか。
マウスでドラッグと同じ要領でこんなコード書いてみた。
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を押した時

}
java.awt.event.KeyEvent クラスの addKeyListener メソッドで this このアプレット(KeyGuruGuru1クラス)を監視されるコンポーネントとして登録。
KeyListener インターフェースの keyPressed メソッドに キーが押された時のお仕事を書く。
KeyEvent クラスの getKeyCode() メソッドを使うと押されてるキーの種類を拾ってこれる。 どの種類のキーが拾われたかは KeyEvent.VK_UP とかのフィールド変数(クラス変数あるいは定数?)を使って場合分けした。
keyReleasedkeyTyped は 使わんけど書いとかなエラーになった。
結果。アプレット領域をマウスでクリックした後、カーソルを押してみそ。円が動くけん。



やれやれ。クラスとメソッドのお勉強にもなったな。

('02.02.26)


Back