我有一个2D数组,例如:
[
[0, 1], // collisionGroup0's references
[0, 1, 2], // collisionGroup1's references
[0, 1], // collisionGroup2's references
];
这个数组为我的游戏引擎定义了一个碰撞贴图。假设有3个碰撞组。从这个数组中,我可以看出以下内容:
collisionGroup0与collisionGroup0和collisionGroup1发生冲突。
collisionGroup1与collisionGroup0、collisionGroup1、collisionGroup2发生冲突。
collisionGroup2与collisionGroup0和collisionGroup1发生冲突。
我希望你能理解。
好的,问题是:
我正在寻找一种方法来循环并删除相互引用。因为collisionGroup0与collisionGroup1冲突,collisionGroup1与collisionGroup0冲突,所以我们只需要一个引用。否则,当我做实际的碰撞检查时,我们会有碰撞被加倍。
我希望处理后的最终数组看起来像这样:
[
[0, 1], // collisionGroup0's references
[2], // collisionGroup1's references
[0, 1], // collisionGroup2's references
];
我现在看到的是这样的:
for (var row : int = 0; row < array.length; ++row)
{
for (var column : int = 0; column < array[row].length; ++column)
{
for (var row2 : int = row + 1; row2 < array.length; ++row2)
{
for (var column2 : int = array[row2].length - 1; column2 >= 0; --column2)
{
if (array[row][column] == array[row2][column2])
array[row2].splice(column2, 1);
}
}
}
}
但那留给我的是:
[
[0, 1], // collisionGroup0's references
[2], // collisionGroup1's references
[], // collisionGroup2's references
];
因为它没有考虑到collisionGroup2与collisionGroup0不是对等的这一事实。
你知道我错过了什么吗?
谢谢!
删除所有碰撞目标的索引大于当前索引的碰撞。例如,去掉
下面的**[
[0, **1**], // collisionGroup0's references
[0, 1, **2**], // collisionGroup1's references
[0, 1], // collisionGroup2's references
];
因为1> 0和2> 1。你可以做相反的事情——但是如果它们是按顺序排列的,就像在例子中一样,这样你最终会截断数组,这可能比砍掉它们的头更快更容易。
我假设互惠引用总是在那里。如果没有,这是无用的!