用砖弹起时球出现问题(打砖块游戏)

时间:2019-06-23 21:34:48

标签: java game-physics bounce balloon

我正在建立类似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;
            }
        }
    }

2 个答案:

答案 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())

因此,它在砖块内部上下弹跳直至边缘。

如何改进它?检测离开砖块并与下一块砖块碰撞后是否在砖块内,并且仅更改方向。