我正在尝试检查两个阵列之间的碰撞,一个是移动的矩形,另一个是文具边界(试图让矩形从墙上反弹)。
问题是我编写了一个嵌套的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)
答案 0 :(得分:0)
假设在执行循环期间_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。