我正在建立一个像阿肯色菜一样的突破球游戏,当球与砖头碰撞时,我有一个很大的问题。当球在砖(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;
}
}
}
乍一看,看起来您的问题在这里:
(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());
因此,当您希望水平逆转时(也许也垂直(时,它会逆转垂直方向。
作为旁注,您可能需要习惯于在单线上使用{}牙套,即使不是严格必要的。它们将帮助您的代码看起来更干净,并避免在以后修改事物时引入错误。