Java 同一ArrayList内的冲突检测
经过几天的搜索,我没有找到解决办法。我有一个冲突元素的Java 同一ArrayList内的冲突检测,java,arraylist,collision-detection,Java,Arraylist,Collision Detection,经过几天的搜索,我没有找到解决办法。我有一个冲突元素的ArrayList,我想迭代并计算冲突。我也做过几次类似的尝试,但我现在被难倒了 碰撞方法(一个游戏勾号调用一次) 您忘记添加一个条件,i!=j 我怀疑您应该更换以下状况: 与: 此外,不需要对所有元素进行双循环,您可以始终从j=i+1开始,然后不必检查i!=j: for(int i=0;i<boxPool.size();i++) { // V for(in
ArrayList
,我想迭代并计算冲突。我也做过几次类似的尝试,但我现在被难倒了
碰撞方法(一个游戏勾号调用一次)
i!=j
与:
此外,不需要对所有元素进行双循环,您可以始终从
j=i+1
开始,然后不必检查i!=j
:
for(int i=0;i<boxPool.size();i++)
{
// V
for(int j=i+1;j<boxPool.size();j++) // <-- this line has changed!
{
if(boxPool.get(i) != boxPool.get(j) && checkCollision(boxPool.get(i), boxPool.get(j)))
{
boxPool.get(i).colliding = true;
boxPool.get(j).colliding = true;
}
}
}
for(int i=0;iI同意@alfasin,但请确保ArrayList的大小不要太大-否则这将需要很长时间。2天前遇到类似的代码,数组可以是任意大小。碰巧我的数据是n=15000,这意味着内部循环执行n*(n-1)/2次-即大约112492500.PS。整个代码最终都是多余的。实际上,boxPool.get(i)!=boxPool.get(j)
检查i!=j
,假设ArrayList的所有元素都是唯一的。@FlightOdyssey你是对的,它的效果也是一样的(而且非常扭曲;)在某个时间点上,我试过了!几乎达到了精确代码的程度。但是,仍然没有成功!我将暂时用此代码替换我的代码。@BoltReel因为我们没有看到所有的代码,所以调试有点困难。可能还有两个失败点:我已经提到过的一个(使用equals
而不是=
),你在课堂上实现了equals
吗?还有一点:实现checkCollision()
你的checkCollision
方法可能有问题。你也能发布这个吗?还有,它有多具体不起作用?我肯定checkCollision()有问题方法有效(我已经运行了多个测试),至于它是如何工作的?好吧……就是这样。绝对没有发生任何事情那么也许iterateBoxes是假的或者碰撞的值被错误地使用了?你在这里发布的代码对我来说看起来很好。这就是为什么它开始影响我!我所有的尝试最终都会做同样的事情。碰撞只是我暂时使用的布尔值绘制要测试的值(如果players框发生冲突),目前我的代码中没有迭代器发生更改的地方。我确保整个方法实际上也被调用。
public boolean checkCollision(BaseAABB box1, BaseAABB box2)
{
//This is just to get the center vector of the bounding boxes.
Vector2f c1 = getAABBCenter(box1);
Vector2f c2 = getAABBCenter(box2);
if(Math.abs(c1.x - c2.x) > (box1.width + box2.width)) return false;
if(Math.abs(c1.y - c2.y) > (box1.height + box2.height)) return false;
return true;
}
boxPool.get(i) != boxPool.get(j)
!boxPool.get(i).equals(boxPool.get(j))
for(int i=0;i<boxPool.size();i++)
{
// V
for(int j=i+1;j<boxPool.size();j++) // <-- this line has changed!
{
if(boxPool.get(i) != boxPool.get(j) && checkCollision(boxPool.get(i), boxPool.get(j)))
{
boxPool.get(i).colliding = true;
boxPool.get(j).colliding = true;
}
}
}