Мой прыгающий шар должен прыгать между границами окна 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" = центральная точка шара.
скриншот мяча на левой границе:
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
}
}