如何遍历对象数组列表 C#?

How to iterate through a List of Arrays of Objects C#?

我正在构建 2D 物理模拟,目前正在研究旋转方块之间的碰撞检测。

我的碰撞检测算法是这样工作的:

问题是第一个 Console.WriteLine() 打印出正确的 Box 索引,但是第二个 Console.WriteLine() 总是打印出 "ObserverBox: 2 ObservedBox: 3" 当有一个 broad-phase碰撞.

这是我的代码:

        //set all boxes to "not colliding"
        foreach (Box box in boxList)
        {
            box.colliding = false;
        }

        List<Box[]> broadPhaseCollisionList = new List<Box[]>();
        Box[] collisionPair = new Box[2];

        for (int i = 0; i < boxList.Count; i++)
        {
            Box observerBox = boxList[i];

            for (int j = i + 1; j < boxList.Count; j++)
            {
                Box observedBox = boxList[j];

                if (observerBox != observedBox)
                {
                    collisionPair[0] = observerBox;
                    collisionPair[1] = observedBox;

                    if (TestAABBOverlap(observerBox.aabb, observedBox.aabb))
                    {
                        observerBox.colliding = true;
                        observedBox.colliding = true;

                        broadPhaseCollisionList.Add(collisionPair);
                        //timer.Stop();
                        Box[] box = broadPhaseCollisionList[0];
                        Console.WriteLine("ObserverBox: " + box[0].index + " ObservedBox: " + box[1].index);
                    }
                }
            }
        }

        for (int i = 0; i < broadPhaseCollisionList.Count; i++)
        {
            Box[] collision = broadPhaseCollisionList[i];
            Box observerBox = collision[0];
            Box observedBox = collision[1];

            Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);
            Console.WriteLine("/-------------------------------------------------------------------------------");
        }

为什么这不起作用?

你必须向下钻取。

broadPhaseCollisionList[i].observerBox[0].ToString()

您总是在写 box[0] 和 box[1] 的值。
您的行可能应该是:

Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);

我认为这里的问题是您只是在每次迭代中向 broadPhaseCollisionList 添加对 collisionPair 数组的引用(您一遍又一遍地添加相同的引用)。同时,collisionPair 项目在每次迭代中更新最新的碰撞。

在循环结束时,collisionPair 包含最后一个碰撞对,broadPhaseCollisionList 包含 [collisionCount] 个项目,所有项目都指向同一个数组。

要解决此问题,您应该在每次将 collisionPair 添加到列表之前将其设置为 new 数组:

if (observerBox != observedBox && TestAABBOverlap(observerBox.aabb, observedBox.aabb))
{
    observerBox.colliding = true;
    observedBox.colliding = true;

    broadPhaseCollisionList.Add(new[] {observedBox, observerBox});