Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同一ArrayList内的冲突检测_Java_Arraylist_Collision Detection - Fatal编程技术网

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;
                }
            }
        }