基于ACM图形的Java Glitchy碰撞检测
我对Java非常陌生,我正在使用ACM库进行图形处理。我试图用这段代码做的是:
-
介绍两个球,一个在左边,一个在中间。它们都在中间,y坐标明智。<李>
- 让第一个球移动直到碰到第二个球。然后停下来,给第二个球一个与其大小成比例的速度(类似于动量守恒)李>
- 使第二个球在墙上反弹,移动直到碰到第一个球。然后停下来,再次给第一个球一个与其大小成比例的速度李>
- 让这个动作无限大李>
我的代码如下:
import java.awt.Color;
import acm.graphics.*;
import acm.program.*;
import acm.util.RandomGenerator;
public class Collision extends GraphicsProgram {
private static final double RADIUS_ONE = 35;
private static final double RADIUS_TWO = 65;
public void run() {
GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE);
ballOne.setFilled(true);
ballOne.setColor(Color.GREEN);
add(ballOne);
GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO);
ballTwo.setFilled(true);
ballTwo.setColor(Color.ORANGE);
add(ballTwo);
double velocityOne = 3;
double velocityTwo = 0;
while (true) {
ballOne.move(velocityOne, 0);
ballTwo.move(velocityTwo, 0);
if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) {
velocityOne = -velocityOne;
}
if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) {
velocityTwo = -velocityTwo;
}
if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) {
if (velocityTwo == 0) {
velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO);
velocityOne = 0;
} else if (velocityOne == 0) {
velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE);
velocityTwo = 0;
}
}
pause(10);
}
}
}
如果运行此代码,您将看到它出现故障。遇到第二个球时,第一个球不会停止移动,而是与第二个球一起移动。但是如果您将velocityOne
改为2而不是3,那么一切正常。或者,如果将RADIUS_TWO
改为45而不是65,则代码对velocityOne
的每一个值都会起到应有的作用
有谁能解释一下,为什么这段代码对大多数值都不起作用,而它应该用这么少的值来工作?非常感谢
# 1 楼答案
在检测碰撞时,你会遇到很多错误!这是很平常的事
出现这些错误的原因是,当您试图检测冲突时,您的代码正在刷新每个间隔(通常可以选择间隔之间的时间),并检查两个对象是否相交。 在这种情况下,我假设你的球过了另一个球太快了,你的“碰撞检查器”无法把它捡起来
你可以做几件事:
-放慢速度
-缩短“检查碰撞”之间的时间
-增加碰撞区域(这意味着即使检查器没有看到边缘碰撞,如果两个区域重叠,它也知道它们已经碰撞了)