我正在建立类似Arkanoid的Breakout Ball游戏,当球与砖块碰撞时,我遇到了一个大问题。当球在砖(brickX,brickX)(brickX,brickX + brickLength)(brickY,brickY)(brickX + brickLength,brickY)的角上碰撞时发生。
这是我的代码:
private void checkCollision() {
for(Brick brick : l.getCurrentLevel().getAllBricks()) {
double bx = b.getX();
if(brick.isShot())
continue;
if(b.getBounds().intersects(brick.getBounds())) {
if (
(b.getX() == brick.getX() || b.getX() == brick.getX() + brick.getLength())
&& (b.getY() >= brick.getY() && b.getY() <= brick.getY() + brick.getHeight())
)
b.setDx(-b.getDx());
else
b.setDy(-b.getDy());
if(brick.isDestroyable()) {
brick.shot();
b.setVelocity(b.getVelocity()+0.05);
}
break;
}
}
}
答案 0 :(得分:0)
乍看之下,您的问题似乎就在这里:
(b.getX() == brick.getX() || b.getX() == brick.getX() + brick.getLength())
如果x每跳动一次(例如)增加5,那么您就可以从b.getX() < brick.getX()
跳到b.getX() > brick.getX()
,而无需达到等于条件。因此,当球进入积木时,它就无法通过该条件并跳到这一条件:
else
b.setDy(-b.getDy());
因此,当您希望水平(或垂直)反转时,它会反转垂直方向。
作为旁注,即使不是严格必要的,您也可能要养成在单行if语句上使用{}大括号的习惯。它们将帮助您的代码看起来更简洁,并避免在以后进行修改时引入错误。
答案 1 :(得分:0)
如果您仔细观察窗口,问题很明显:球总是上下移动。这意味着您要反转y坐标并保持x坐标的平移。球在右边缘以另一种方式弹回。
为什么会这样?输入的砖块不完全位于边缘(这是正常返回的唯一机会)。
(b.getX() == brick.getX() || b.getX() == brick.getX() + brick.getLength())
因此,它在砖块内部上下弹跳直至边缘。
如何改进它?检测离开砖块并与下一块砖块碰撞后是否在砖块内,并且仅更改方向。