以下是我尝试检查球和板之间的碰撞检测的方法:
首先,我们将检查球是否在 x 轴上与棋盘“碰撞”。我们必须检查三个状态:
- 第一个是,球的左侧不与板对齐,但右侧却如此。
- 第二个是,球的左侧确实与板对齐,但右侧没有。
- 第三个是,球的左侧和右侧与板对齐。
这是一张使它可视化的图像:
这就是我们以编程方式应用这些规则的方式:
// 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 速度并将数字更改为正数或负数,例如。如果速度为负,则使其为正,反之亦然。
我希望这有帮助!