碰撞检测工作的一半时间

时间:2011-05-25 02:57:53

标签: android collision-detection

我正在尝试检查两个阵列之间的碰撞,一个是移动的矩形,另一个是文具边界(试图让矩形从墙上反弹)。

问题是我编写了一个嵌套的for循环,似乎适用于4个边界中的2个。我的循环没有达到所有可能的组合吗?

这是我的循环:

for(int n=0;n<_f;n++){
   for(int m=0;m<_b;m++){
       if(farr[n].inter(barr[m]))
           farr[n].setD();
   }
}

_f计算移动的矩形(从0开始并在添加每个矩形后增加),_b计算边界。 inter()是我用来检测冲突的方法,它在我的程序的所有其他部分都有效。

任何帮助将不胜感激, 谢谢你的推荐!

public boolean inter(Rect rect){
    if(Rect.intersects(rect, rec))
        return true;
    else
        return false;
}

setD()方法:

public void setD(){
    if(_d==0)
        _d=2;
    if(_d==1)
        _d=3;
    if(_d==2)
        _d=0;
    if(_d==3)
        _d=1;
    }

使用_d的移动方法:

public void moveF(){
    if(_d==0){_l+=_s;_r+=_s;}
    if(_d==1){_t+=_s;_b+=_s;}
    if(_d==2){_l-=_s;_r-=_s;}
    if(_d==3){_t-=_s;_b-=_s;}
}

_l是左侧,_t是顶部,_r是右侧,_b是底部,_s是每次迭代移动的像素数(在所有情况下都设置为1)

1 个答案:

答案 0 :(得分:0)

假设在执行循环期间_f,_b,farr和barr没有改变,你的循环只检查所有组合一次。那你怎么“两次检查一些碰撞”呢? setD()做鬼鬼祟祟的事吗?你是说一旦矩形碰撞就没有必要检查更多的边界?如果是这样,可以使用简单的break语句修复。否则,您的inter()方法可能存在问题,无论其是否在其他地方起作用都是独立的。你能发布你的实施吗?

存在另一个问题,即在离散空间中假设连续属性。正如我令人惊叹的ascii艺术(标题为:球和墙)技能展示......

第1帧:

o__|_

第2帧:

_o_|_

第3帧:

__o|_

第4帧:

___|o

请注意球穿过墙壁!在没有框架的情况下,球与墙壁相交。如果每帧移动的距离大致等于或大于移动物体的特征尺寸,则会发生这种情况。通过简单的交叉检查很难检查。你实际上需要检查球在帧之间占用的路径。

如果您的矩形和障碍物的方向没有旋转,这仍然是一个相当容易的检查。使用两个帧之间移动矩形的边界矩形,并将其与障碍物相交。

其他想法:

  1. 碰撞,两次切换方向。

  2. 您的矩形位于两个不同的坐标空间中。

  3. 其他一些主题正在与您的作品联系。

  4. 但基本上,你的代码看起来不错。你有几个矩形?你能让它们变成鲜明的颜色吗?然后,在你的循环中,当你发生碰撞时,调用setD并输出碰撞的矩形的颜色,以及碰撞的位置。然后,当您发现问题时,请终止代码并查看输出。如果你连续看到两个碰撞(导致rect切换两次方向),你就会发现你的错误。如果您处于两个不同的坐标空间中,输出坐标也可能会有所帮助。

    如果这是一个线程问题,那么是时候了解关键部分。

    发现你的错误:

    public void setD(){
        if(_d==0)
            _d=2;
        if(_d==1)
            _d=3;
        if(_d==2)
            _d=0;
        if(_d==3)
            _d=1;
        }
    

    其中每个都需要为else,否则你将0更新为2而然后 2将在同一个调用中变为0。