【发布时间】:2014-04-17 10:35:11
【问题描述】:
我有一个具有位置、速度和加速度向量作为属性的球类。我的程序实例化了两个球对象,并根据它们之间的重力移动它们。
我的一切工作都很好,但我正在尝试实现一种碰撞检测功能,使球相互反弹。
这里是更新速度的方法:
public Chaney2DVector collisionVelocity(Ball ball2)
{
float x = velocity.x + ((ball2.mass / mass) * (ball2.velocity.x -
ball2.collisionVelocity(this).x));
float y = velocity.y + ((ball2.mass / mass) * (ball2.velocity.y -
ball2.collisionVelocity(this).y));
Chaney2DVector updatedVelocity = new Chaney2DVector(x,y);
velocity = updatedVelocity;
return velocity;
}
我使用了一种叫做递归的方法,不是吗?这是我第一次尝试这样做,如果我做错了什么,请道歉。
当我的程序运行时,我在更新方法中激活了这个碰撞条件:
if (this.getDistance(ball2) < (this.radius + ball2.radius))
{
velocity = this.setVelocity(collisionVelocity(ball2).x,
collisionVelocity(ball2).y);
}
我希望这个程序将新的碰撞速度分配给每个球的速度变量。当我运行程序时,球彼此移动得很好。但是,当球相撞时,它们不会反弹……它们在静止位置粘在一起,我得到一个堆栈溢出错误。我在其他地方读到这可能与终止条件有关,但我不知道这意味着什么。有什么想法吗??
非常感谢您的帮助!
【问题讨论】:
-
递归的第一条规则是(不是“不要谈论递归”)总是有一个终止条件。您只需调用相同的方法,直到获得
StackOverflowError。你需要一些条件来调用别的东西。 -
@BoristheSpider 那么在我的情况下,终止条件是什么样的?抱歉我的无知,但举个例子会很酷。
-
看看this。请注意所有示例如何具有返回值而不是递归调用的条件。
-
@BoristheSpider 我查看了您的链接(谢谢,顺便说一句!)并了解您对终止条件的意思(我认为)。我不明白的是如何让我的功能终止。我尝试使用 n=0、while (n=0) 和 n++ 使其计算一次,但我觉得我完全错过了使用条件来控制递归函数在自身内部挖掘多少次这一点。我被困住了,有点沮丧,所以如果这根本没有意义,我深表歉意。
标签: java collision-detection physics collision game-physics