[英]How to iterate through a List of Arrays of Objects C#?
我正在建立2D物理模拟,目前正在研究旋转方块之间的碰撞检测。
我的碰撞检测算法如下所示:
问题在于,当出现广谱相冲突时,第一个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.