我有这个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);
}
这是做什么的,删除动画片段(确定到目前为止这么好)但没有拼接,当循环再次通过阵列时,它仍然存在。因此,对于被注释掉的拼接有一个小问题,它会从阵列中删除所有的动画片段。显然。
我如何只拼接正在检查的当前索引?
答案 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
}