弹跳球不会在边界处停止 JAVA

Bouncing Ball won't stop at borders JAVA

我的弹跳球会在 200x200 window 的边界之间弹跳。 当他触及右侧和底部边界时,我设法让他停下来改变方向。 但是当他到达顶部和左侧边界时,球的 1/4 穿过边界,然后才改变方向。

我不知道为什么会这样,我的意思是每个边框实际上都是相同的代码行。 怎么可能相同的代码会有不同的工作方式呢?

我在网上浏览了很多关于这个主题的代码,并尝试了每一个解决方案或代码,但它仍然保持不变。

谢谢。

 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" = 球的中心点。

左边框小球截图:

 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
    }
}

I mean it's literally the same code lines for each border

那就是问题所在。不同的情况怎么可能一样呢?

当球移动到 right/down 时,x/y 值增加。

当球移动到 left/up 时,x/y 值减小。

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

我猜应该是:

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

这假设 "center" 实际上是圆心。

编辑:

另外:

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

在这两种情况下 x 速度变化如何为负。

向右移动时,您从正速度变为负速度

那么向左行驶时,您不应该从负速度变为正速度吗?

好的,下面是工作代码: public 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();
}

问题不在于代码,而在于我输入检查圆的起点。 如果半径为 30,则不能将圆的起始中心点设为 (20,50)。 为什么? 因为那么圆从一开始就是越界的,因为他的起始圆心是20,50,半径是30,也就是说他的左边半径会达到(-10, 50)。这就是为什么我有很多问题。 你总是应该检查起点是否适合半径。