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 轴上与棋盘“碰撞”。我们必须检查三个状态:

  1. 第一个是,球的左侧不与板对齐,但右侧却如此。
  2. 第二个是,球的左侧确实与板对齐,但右侧没有。
  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:我写的很晚,如果有什么不对的地方请见谅,我会尽快改正的。

更新:

如果您希望球在与板相撞时以某个角度跳跃,则取球与板碰撞的角度,并让它以该角度向另一个方向反弹。有两种方法可以做到这一点:

  • 使用一些三角函数来找到角度。
  • 您也可以简单地获取球的 x 速度并将数字更改为正数或负数,例如。如果速度为负,则使其为正,反之亦然。

我希望这有帮助!

于 2012-08-05T21:53:40.527 回答