Search code examples
javaarraylistcollision-detection

Collision detection inside the same ArrayList


After searching around over the course of a few days, I have not found a solution. I have an ArrayList of collision elements that I want to iterate over and calculate collisions for. I have made several similar attempts, but I am currently stumped.

Collision method (called once a game-tick)

public void iterateCollision()
{ 
    if(iterateBoxes)
    {   
        if(iterateBoxes)
    {   
        for(int i=0;i<boxPool.size();i++) 
        {   
            for(int j=i+1;j<boxPool.size();j++)
            {
                if(!(boxPool.get(i).equals(boxPool.get(j))) && checkCollision(boxPool.get(i), boxPool.get(j)))
                {
                    boxPool.get(i).colliding = true;
                    boxPool.get(j).colliding = true;
                }
            }
        }
    }
    }
}

Here is the collision detection method for those of you who would like to review it:

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

Solution

    1. You forgot to add a condition that i != j

    2. I suspect that you should replace the following condition:


    boxPool.get(i) != boxPool.get(j)
    

    with:

    !boxPool.get(i).equals(boxPool.get(j))
    

    Further, there's no need to double loop over all the elements, you can always start with j = i + 1 and then you don't have to check that 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;
                }
            }
        }