読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



ラケットでボールを打ち返す

Javagame

ボールとラケットの当たり判定処理を入れてボールがラケットに当たったとき跳ね返るようにします。ブロックがなくてボールをただ打ち返して対戦するゲームは「ぽん」っていいますが、これは1人用の「ぽん」に相当しますね。ブロック崩しではなくぽんを作るのも面白いかも。

breakout03.jar

まずMainPanelクラスを見てみます。

    /**
     * ゲームループ
     * 
     */
    public void run() {
        while (true) {
            // ボールの移動
            ball.move();

            // もしラケットと衝突したらボールをバウンド
            if (racket.collideWith(ball)) {
                ball.boundY();
            }

            repaint();

            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

ボールを移動した後にラケットとボールが衝突したらボールをY方向にバウンドします。Y方向にバウンドすると下に移動していたボールが上に移動します。衝突の判定はracket.collideWith(ball)です。ラケットにボールが当たるとtrueを返します。

次にcollideWith()を見てみます。Racketクラスです。

    /**
     * ボールに当たったらtrueを返す
     * 
     * @param ball ボール
     * @return ボールに当たったらtrue
     */
    public boolean collideWith(Ball ball) {
        // ラケットの矩形
        Rectangle racketRect = new Rectangle(
                centerPos - WIDTH / 2, MainPanel.HEIGHT - HEIGHT,
                WIDTH, HEIGHT);
        // ボールの矩形
        Rectangle ballRect = new Rectangle(
                ball.getX(), ball.getY(),
                ball.getSize(), ball.getSize());

        // ラケットとボールの矩形領域が重なったら当たっている
        if (racketRect.intersects(ballRect)) {
            return true;
        }

        return false;
    }

ラケットとボールの衝突判定は、ラケットとボールの矩形が重なったかどうかで判定しています。 racketRectはラケットの矩形、ballRectはボールの矩形です。ボールは円形ですが、円を囲む四角形としています。2つの矩形が重なっているかはRectangleクラスのintersects()メソッドでわかります。矩形が重なった場合、trueを返します。