Прыгающий мяч не остановится на границах JAVA - PullRequest
0 голосов
/ 23 апреля 2020

Мой прыгающий шар должен прыгать между границами окна 200x200. Мне удалось заставить его остановиться и изменить направление, когда он касается правой и нижней границ. Но когда он достигает верхней и левой границ, 1/4 мяча проходит через границу, и только тогда он меняет направление.

Я понятия не имею, почему это происходит, я имею в виду, что это буквально те же строки кода за каждую границу. Как может быть так, что для одного и того же кода он будет работать по-другому?

Я просмотрел множество кодов вокруг net об этой топике c и перепробовал каждое решение или код, и он все еще остается то же самое.

Спасибо.

 public Point applyToPoint(Point p) {
        return new Point(p.getX() + dx, p.getY() + dy);
    }

    public void moveOneStep(int width, int height) {
    if (this.center.getX() + this.getVelocity().dx + r > width) {
        this.setVelocity(-(this.getVelocity().dx), this.getVelocity().dy);
    }
    if (this.center.getX() + this.getVelocity().dx < 0) {
        this.setVelocity(-(this.getVelocity().dx), this.getVelocity().dy);
    }
    if (this.center.getY() + this.getVelocity().dy + r > height) {
        this.setVelocity(this.getVelocity().dx, -(this.getVelocity().dy));
    }
    if (this.center.getY() + this.getVelocity().dy < 0) {
        this.setVelocity(this.getVelocity().dx, -(this.getVelocity().dy));
    }
    moveOneStep();
}

public void moveOneStep() {
    this.center = this.getVelocity().applyToPoint(this.center);
}

r = радиус шара.

"this.center" = центральная точка шара.

скриншот мяча на левой границе:

img

 import biuoop.DrawSurface;
import biuoop.GUI;
import biuoop.Sleeper;

public class BouncingBallAnimation {

    static private void drawAnimation(Point start, double dx, double dy) {
        GUI gui = new GUI("BouncingBall",200,200);
        Sleeper sleeper = new Sleeper();
        Ball ball = new Ball(new Point(start.getX(), start.getY()), 30, java.awt.Color.BLACK);
        ball.setVelocity(dx, dy);
        while (true) {
            DrawSurface d = gui.getDrawSurface();
            ball.moveOneStep(d.getHeight(),d.getWidth());
            ball.drawOn(d);
            gui.show(d);
            sleeper.sleepFor(50);  // wait for 50 milliseconds.
        }
    }
    public static void main(String[] args) {
        drawAnimation(new Point(20,33),6,6); //just a random input that I decided
    }
}

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Хорошо, вот рабочий код: publi c void moveOneStep (int startX, int height, int startY, int width) {

    if (this.center.getX() + this.getVelocity().dx + r >= width) {
        this.setVelocity(-1 * (this.getVelocity().dx), this.getVelocity().dy);
    }
    if (this.center.getX() + this.getVelocity().dx - r <= startX) {
        this.setVelocity(-1 * (this.getVelocity().dx), this.getVelocity().dy);
    }
    if (this.center.getY() + this.getVelocity().dy + r >= height) {
        this.setVelocity(this.getVelocity().dx, -1 * (this.getVelocity().dy));
    }
    if (this.center.getY() + this.getVelocity().dy - r <= startY) {
        this.setVelocity(this.getVelocity().dx, -1 * (this.getVelocity().dy));
    }
    moveOneStep();
}

Проблема была не в коде, а в начальной точке I вошел, чтобы проверить круг. Вы не можете дать кругу начальную центральную точку, скажем, (20,50), если радиус равен 30. Почему? Потому что тогда круг будет вне границ с самого начала, потому что он имеет начальную центральную точку 20,50 и радиус 30, что означает, что его левый радиус достигнет (-10, 50). И именно поэтому у меня было много проблем. Вы всегда должны проверять, соответствует ли начальная точка радиусу.

0 голосов
/ 23 апреля 2020

Я имею в виду, что это буквально одинаковые строки кода для каждой границы

И это будет проблемой. Как это может быть одинаково, потому что у вас разные ситуации?

Когда мяч перемещается вправо / вниз, значения x / y увеличиваются.

Когда мяч перемещается влево / вверх значения x / y уменьшаются.

if (this.center.getX() + this.getVelocity().dx < 0) {

Я бы предположил, что должно быть:

if (this.center.getX() - this.getVelocity().dx - r < 0) {

Это предполагает, что «центр» на самом деле является центром круга.

Редактировать:

Также:

    this.setVelocity(-(this.getVelocity().dx), this.getVelocity().dy);
}
if (this.center.getX() + this.getVelocity().dx < 0) {
    this.setVelocity(-(this.getVelocity().dx), this.getVelocity().dy);

Как изменение скорости х может быть отрицательным в обоих случаях.

При перемещении вправо вы go от положительная скорость к отрицательной скорости

Так что, двигаясь влево, не следует ли вам перейти от отрицательной скорости к положительной скорости?

...