碰撞检测工作时间只有一半

问题描述

| 我正在尝试检查两个数组之间的碰撞,一个是移动的矩形,另一个是文具边界(试图使矩形从墙弹起)。 问题是我写了一个嵌套的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()是我用来检测冲突的一种方法,它已在程序的所有其他部分起作用。 任何帮助将不胜感激, 感谢advace !!!
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的move方法
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)     

解决方法

假设_f,_b,farr和barr在循环执行期间不变,则循环将对所有组合进行一次精确检查。那么,“两次检查一些碰撞”又如何呢? setD()是否会偷偷摸摸地做些什么?您是说矩形碰撞后就不需要检查更多边界了吗?如果是这样,可以使用简单的break语句解决该问题。否则,您的inter()方法可能存在问题,而与它是否在其他地方似乎有效无关。您可以发布内部实现吗? 存在另一个问题的可能性,即在离散空间中假设连续属性。正如我惊人的ascii艺术(标题:球和墙)所展示的... 框架1:
o__|_
框架2:
_o_|_
框架3:
__o|_
框架4:
___|o
注意,球穿过了墙!球没有与墙相交。如果每帧移动的距离可以大致等于或大于移动物体的特征尺寸,则会发生这种情况。用简单的交点检查很难检查。您实际上需要检查球在框架之间占据的路径。 如果矩形和障碍的方向没有旋转,这仍然是相当容易的检查。在两个框架之间使用移动矩形的边界矩形,并将其与障碍相交。 其他想法: 您正在两次碰撞,两次切换方向。 您的矩形位于两个不同的坐标空间中。 其他螺纹正在拧入您的直肠。 但基本上,您的代码看起来不错。你有几个矩形?您能使它们具有鲜明的色彩吗?然后,在循环中,当您发生碰撞时,调用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。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...