人工知能に関する断創録

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

ラケットを動かす

マウスの動きに合わせてラケットが左右に動くプログラムから作ります。

breakout01.jar

マウス座標の取得

マウスの動きに反応するプログラムを作るにはMouseMotionListenerを使います。下はMainPanel.javaの抜粋です。

public class MainPanel extends JPanel implements MouseMotionListener {
    private Racket racket; // ラケット

    public MainPanel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        addMouseMotionListener(this);

        // ラケットを作成
        racket = new Racket();
    }

    // マウスを動かしたとき呼び出される
    public void mouseMoved(MouseEvent e) {
        int x = e.getX(); // マウスのX座標
        racket.move(x); // ラケットを移動
        repaint();
    }

    // マウスをドラッグしたとき呼び出される
    public void mouseDragged(MouseEvent e) {
    }
}

MainPanelクラスにMouseMotionListenerをimplementsしてマウスの動きを感知できるようにしています。またaddMouseMotionListener(this)も忘れずに呼び出す必要があります。ここらはマウスクリックと非常によく似ています。マウスクリック(2004/10/16)の場合は、マウスのクリックに反応するのに対し、今回はマウスの動きに反応します

マウスの動きに対して何をするかはmouseMoved()とmouseDragged()に処理を書きます。mouseMoved()はマウスを動かしたときの反応を書く場所でmouseDragged()はマウスをドラッグしたときの反応を書く場所です。今回はmouseMoved()だけ実装します。内容は簡単でマウスの座標を取得し、マウスの位置にラケットを移動するだけです。ただし、移動するのはX方向(横方向)だけです

Racketクラス

ボールを打ち返すラケットのクラスです。

public class Racket {
    // ラケットのサイズ
    public static final int WIDTH = 80;
    public static final int HEIGHT = 5;

    // ラケットの中心位置
    private int centerPos;

    public Racket() {
        // ラケットの位置を画面の真ん中で初期化
        centerPos = MainPanel.WIDTH / 2;
    }

    /**
     * ラケットの描画
     * 
     * @param g
     */
    public void draw(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(centerPos - WIDTH / 2, MainPanel.HEIGHT - HEIGHT,
                   WIDTH, HEIGHT);
    }

    /**
     * ラケットの移動
     * 
     * @param pos 移動先座標
     */
    public void move(int pos) {
        centerPos = pos;

        // ラケットが画面の端から飛び出ないようにする
        if (centerPos < WIDTH / 2) { // 左端
            centerPos = WIDTH / 2;
        } else if (centerPos > MainPanel.WIDTH - WIDTH / 2) { // 右端
            centerPos = MainPanel.WIDTH - WIDTH / 2;
        }
    }
}

ラケットの位置はcenterPosです。これは、ラケットの真ん中のX座標を表しているので注意してください。長方形の左上のX座標ではないです。またラケットは常に画面の下にあるのでY座標は特に必要ないです。ラケットを移動するメソッドmove()ではラケットが画面の外に飛び出さないようにしています。

今回はマウスで動かすようにしますがキーボードの左右キーで動かせるように拡張してみるのもよいかと思います。