繁体   English   中英

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

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

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

我的碰撞检测算法如下所示:

  • 宽相
    • 检查框的轴对齐边界框是否重叠
    • 如果是这样,请将重叠的2个框放入2元素数组中,并将此数组放在列表中(broadPhaseCollisionList)
  • 窄相
    • 遍历broadPhaseCollisionList并检查碰撞(由Box []表示)以判断它们是否真的在碰撞

问题在于,当出现广谱相冲突时,第一个Console.WriteLine()打印出正确的Box索引,但是第二个Console.WriteLine()始终打印出“ ObserverBox:2 ObservedBox:3”。

这是我的代码:

        //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("/-------------------------------------------------------------------------------");
        }

为什么这不起作用?

我相信这里的问题是,你只是增加了一个参考collisionPair阵列您broadPhaseCollisionList在每次迭代(你一遍又一遍地将相同的参考)。 同时, collisionPair项目得到与在每次迭代的最新碰撞更新。

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

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

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

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

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

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

您必须向下钻取。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM