Проблема с мячом, когда он отскакивает от кирпича (арканоидная игра) - PullRequest
0 голосов
/ 24 июня 2019

Я создаю игру Breakout Ball, такую ​​как Arkanoid, и у меня большая проблема, когда мяч сталкивается с кирпичами. Это происходит, когда шарик сталкивается с углом кирпича (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 голосов
/ 24 июня 2019

Если вы внимательно посмотрите на свое окно, проблема ясна: мяч всегда движется вверх и вниз. Это означает, что вы инвертируете Y-Coor и сохраняете перевод для X-Coor. На правом краю мяч отскакивает в другую сторону.

Почему это происходит? Вы вводите кирпич не совсем по краю (это будет единственный шанс вернуться в обычном порядке).

(b.getX() == brick.getX() || b.getX() == brick.getX() + brick.getLength())

Поэтому он подпрыгивает вверх и вниз внутри кирпича до края.

Как вы можете улучшить его? Определите, находитесь ли вы внутри кирпича, и измените только направление после того, как вы покинули кирпич и столкнулись со следующим.

0 голосов
/ 24 июня 2019

На первый взгляд похоже, что ваша проблема здесь:

(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, даже если они не являются строго необходимыми. Они помогут вашему коду выглядеть чище и избежать ошибок при последующих изменениях.

...