0

ゲーム (BrickBraker) に次のコードがあり、下部のバーとのボールの衝突を確認します。しかし、ボールがバーに当たらなくても衝突があるとまだ言っています。

以下で使用しているコードの何が問題になっていますか?

if(ball.x + ball.getWidth() > bar.x && ball.x < bar.x + (bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (bar.getWidth()/5) && ball.x < bar.x + (2*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (2*bar.getWidth()/5) && ball.x < bar.x + (3*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (3*bar.getWidth()/5) && ball.x < bar.x + (4*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (4*bar.getWidth()/5) && ball.x < bar.x + bar.getWidth()) {
    ...
}
4

1 に答える 1

1

ボールとボードの間の衝突検出をチェックする方法は次のとおりです。

まず、ボールが x 軸上のボードと「衝突」したかどうかを確認します。確認する必要がある状態は 3 つあります。

  1. 1つ目は、ボールの左側がボードと整列していませんが、右側は整列しています。
  2. 2 つ目は、ボールの左側はボードと一致しますが、右側は一致しません。
  3. 3 つ目は、ボールの左右がボードと一直線になることです。

これを視覚化するための画像を次に示します。

例

これらのルールをプログラムで適用する方法は次のとおりです。

// First case
if(ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) {

}
// Second case
if(ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX()) {

}
// Third case
if((ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) && (ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX())) {

}

これらの条件のいずれかが満たされている場合、これは、ボールが x 軸上でボードと整列していることを意味します。そのため、それらが y 軸上で整列しているかどうかを確認する必要があるため、最終的にそれらが互いに接触しているかどうかを知ることができます。

条件が満たされた場合に任意の if ステートメントから呼び出すことができるメソッドを作成できます。

public boolean checkYAlignment() {
// Check y alignment
if(ball.getY == board.getY || ball.getY() < board.getY()) {
// The ball and board have collided!
return true;
}
else {
return false;
}
}

上記のすべてのコードは、ボールとボードが衝突したかどうかを示すブール値を返すメソッドの形式にまとめられています。

public boolean checkCollision() {
// First case
    if(ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) {
    return checkYAlignment();
    }
    // Second case
    else if(ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX()) {
    return checkYAlignment();
    }
    // Third case
    else if((ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) && (ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX())) {
return checkYAlignment();
    }
else {
return false;
}
}

これが役に立ち、うまくいくことを願っています!

PS: 私はこれを非常に遅く書いています。何か間違っていたらすみません。できるだけ早く修正しようと思います。

アップデート:

ボールがボードに衝突したときにある角度でボールをジャンプさせたい場合は、ボールがボードに衝突する角度を取り、その角度で反対方向に跳ね返らせます。これを行うには、次の 2 つの方法があります。

  • 角度を見つけるためにいくつかの三角法を使用してください。
  • また、単純にボールの x 速度を取り、数値を正または負に変更することもできます。速度が負の場合は正にし、その逆も同様です。

これが役立つことを願っています!

于 2012-08-05T21:53:40.527 に答える