人工知能に関する断創録

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

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

ボールとラケットの当たり判定処理を入れてボールがラケットに当たったとき跳ね返るようにします。ブロックがなくてボールをただ打ち返して対戦するゲームは「ぽん」っていいますが、これは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を返します。