0

我有这个 foreach 循环来检查碰撞,我希望在发生碰撞时删除平台(movieclip)。到目前为止,我想出了这个:

if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y) 
                                {
                                    mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1;
                                    jump();
                                    mcContent.removeChild(platformCloud);
                                    //platformsCloud.splice(platformCloud);
                                }

这样做是,删除movieclip(到目前为止还不错)但没有拼接,当循环再次通过数组运行时,它仍然存在。因此,注释掉的拼接存在 1 个小问题,它显然会从数组中删除所有影片剪辑。

我怎样才能只拼接正在检查的当前索引?

4

2 回答 2

1

.splice()接受起始索引和要删除的项目数量,而不是要从数组中删除的对象。

参数

startIndex:int— 一个整数,它指定数组中插入或删除开始的元素的索引。您可以使用负整数来指定相对于数组末尾的位置(例如,-1 是数组的最后一个元素)。

deleteCount:uint— 一个整数,指定要删除的元素数。此数字包括 startIndex 参数中指定的元素。如果不为 deleteCount 参数指定值,则该方法将删除数组中从 startIndex 元素到最后一个元素的所有值。如果值为 0,则不删除任何元素。

你想这样做:

var index:int = platformsCloud.indexOf(platformCloud);
platformsCloud.splice(index, 1);
于 2013-05-28T23:24:27.673 回答
0

为什么不创建一个的项目数组来保留?用于Array.push添加新项目。这实际上可能比修改现有数组更有效。它也不需要跟踪索引(需要使用Array.splice)。

示例代码:

var keptPlatforms = [];
// do stuff
if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y) 
{
    mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1;
    jump();
    mcContent.removeChild(platformCloud);
} else {
    keptPlatforms.push(platformCloud);
}
// later, after this cycle, use the new Array
platformClouds = keptPlatforms;

现在,platformsCloud.splice(platformCloud)删除所有项目的原因是因为第一个参数被强制为整数,所以它相当于platformsCloud.splice(0)“将第 0 个索引项目删除到数组的末尾”。而且,这确实清除了数组。

要使用Array.splice,您必须执行以下操作:

// inside a loop this approach may lead to O(n^2) performance
var i = platformClouds.indexOf(platformCloud);
if (i >= 0) {
    platformClouds.splice(i, 1); // remove 1 item at the i'th index
}
于 2013-05-28T22:04:17.713 回答