我怎样才能在foreach中拼接当前索引?

时间:2013-05-28 21:58:13

标签: arrays actionscript-3 flash-cs5 splice

我有这个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);
                                }

这是做什么的,删除动画片段(确定到目前为止这么好)但没有拼接,当循环再次通过阵列时,它仍然存在。因此,对于被注释掉的拼接有一个小问题,它会从阵列中删除所有的动画片段。显然。

我如何只拼接正在检查的当前索引?

2 个答案:

答案 0 :(得分:1)

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

  

<强>参数

     

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

     

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

你想这样做:

var index:int = platformsCloud.indexOf(platformCloud);
platformsCloud.splice(index, 1);

答案 1 :(得分:0)

为什么不创建要保留的项目的 new 数组?使用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),表示“删除0th-indexed”项目到数组的末尾“。而且,这确实清除了阵列。

要使用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
}