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