我按照http://www.emanueleferonato.com/2007/08/19/managing-ball-vs-ball-collision-with-flash/上的示例在Android上创建了球碰撞,
我的代码组织如下:
int N = 6; // number of balls
for (int i=0; i<N; i++) {
// move ball
// as in line 10~39
// collision detection
for(int j=i+1; j<N; j++) {
// as in line 66~77
} // end for
} // end for
然而,有时我的球可能会粘在一起(重叠)
在这个例子中没有发生同样的情况
为什么呢?
我是否需要为每个球开始一个线程?
答案 0 :(得分:1)
可能是
ball.xspeed = Math.random()*8-4;
ball.yspeed = Math.random()*8-4;
这些生成浮点xspeed和yspeeds。圆形/浮点数/ ceil值用于在屏幕中绘制。我认为当碰撞检测程序运行并检查碰撞时,如果球在计算中只有很小的距离,则无法找到一个,但是当速度更高时,下一步将把球推入其边界。一旦它们在彼此内部,function manage_bounce(ball, ball2)
将在每个增量上被调用,并尝试调整反弹方向,但仅发现另一个碰撞。
我认为主要的问题是由于速度值很大而协调的大幅增加,但是两个球之间的距离很小,它们相互推入模式,而不是浮点计算。
在您检测到碰撞的计算过程中,您应该确保它们不在彼此内部,如果是,则将它们取出并重新定位。或者你可以考虑一个速度增量,如果两个球的距离比增加的距离更多,或类似这样的
if the balls are `dn` pixels apart
if the speed in direction `n` is `n_speed`
then
if `dn` < `n_speed`
`n = n + dn`
else
`n = n + n_speed`
endif
endif
endif
答案 1 :(得分:1)
当两个球以足够的速度碰撞使得它们在随后的动作循环中不能完全分离时,会出现这个问题。我发现处理这个的最好方法是将它们之间的距离标准化为(r1 + r2),其中r是检测到碰撞时球的半径。这可以确保它们在随后的动作循环中分离,但是如果在非常狭窄的空间中有很多球,则确实有可能造成额外的碰撞。