球碰撞:球粘在一起



我在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

然而,有时我的球可能会粘在一起(重叠)
在这个例子中没有发生同样的情况
为什么
我需要为每个球开始一个线程吗?

当两个球以足够的速度碰撞而无法在随后的动作循环中完全分离时,就会出现这个问题。我发现处理这一问题的最佳方法是将它们之间的距离归一化为(r1+r2),其中r是每当检测到碰撞时球的半径。这样可以确保它们在随后的动作循环中分离,但如果在非常狭小的空间中有很多球,确实有可能导致额外的碰撞。

可能是

ball.xspeed = Math.random()*8-4;
ball.yspeed = Math.random()*8-4;

它们生成浮点xspeed和yspeed。四舍五入的/foat/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

最新更新