我只是尝试编写一个外观漂亮的物理游戏。
球的碰撞看起来很好,但如果球的碰撞速度太慢,它们就会“粘”在一起。我不知道它们为什么这样做。
这是我的碰撞函数:
private void checkForCollision(ArrayList<Ball> balls) {
for (int i = 0; i < balls.size(); i++) {
Ball ball = balls.get(i);
if (ball != this && ball.intersects(this)) {
this.collide(ball, false);
}
}
}
public boolean intersects(Ball b) {
double dx = Math.abs(b.posX - posX);
double dy = Math.abs(b.posY - posY);
double d = Math.sqrt(dx * dx + dy * dy);
return d <= (radius + b.radius);
}
private void collide(Ball ball, boolean b) {
double m1 = this.radius;
double m2 = ball.radius;
double v1 = this.motionX;
double v2 = ball.motionX;
double vx = (m1 - m2) * v1 / (m1 + m2) + 2 * m2 * v2 / (m1 + m2);
v1 = this.motionY;
v2 = ball.motionY;
double vy = (m1 - m2) * v1 / (m1 + m2) + 2 * m2 * v2 / (m1 + m2);
if (!b)
ball.collide(this, true);
System.out.println(vx + " " + vy);
motionX = vx * BOUNCEOBJECT;
motionY = vy * BOUNCEOBJECT;
}
但是当它们与低速碰撞时会发生什么:
![此处输入图片描述](https://istack.dev59.com/krFJx.webp)
那么,你有什么想法吗?
编辑:
Alnitak 的更新效果非常好......但仍然存在一个问题......如果我像这样添加重力:
public void physic() {
motionY += GRAVITY; // <= this part (GRAVITY is set to 0.3D)
checkForCollision(screen.balls);
keyMove();
bounceWalls();
posX += motionX;
posY += motionY;
}
他们仍然相互移动。我认为这是错误的添加重力的方式,不是吗?
而且,我认为我在碰撞公式方面做错了什么,因为它们没有正确地下落:
![落球](https://istack.dev59.com/dk9hQ.webp)
然后它们慢慢地沉入地面。
编辑:找到了一个惊人的教程:http://www.ntu.edu.sg/home/ehchua/programming/java/J8a_GameIntro-BouncingBalls.html