弹跳球不会在边界处停止 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)。这就是为什么我有很多问题。
你总是应该检查起点是否适合半径。
我的弹跳球会在 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)。这就是为什么我有很多问题。 你总是应该检查起点是否适合半径。