我试图创建一个涉及子弹数组和僵尸数组的碰撞代码。但是当它尝试这段代码时:
for(var bu:int = 0;bu < bullets.length; bu++){
for(var zo:int = 0;zo < zombieCount.length; zo++){
if(bullets[bu].hitTestObject(zombieCount[zo])){
stage.removeChild(zombieCount[zo]);
zombieCount.splice(zo, 1);
stage.removeChild(bullets[bu]);
bullets.splice(bu, 1);
trace("hot hit")
}
}
}
我有时会收到错误消息。我试过这段代码:
for(var bu:int = 0;bu < bullets.length; bu++){
for(var zo:int = 0;zo < zombieCount.length; zo++){
if(bullets[bu].hitTestObject(zombieCount[zo])){
stage.removeChild(zombieCount[zo]);
if(zombieCount.splice(zo,1)!=null){
zombieCount.splice(zo, 1)
}
stage.removeChild(bullets[bu]);
bullets.splice(bu, 1)
if(bullets.splice(bu,1)!=null){
bullets.splice(bu, 1)
}
trace("hot hit")
}
}
}
然而,即使信息没有出现,对象(或者更确切地说是它的遗骸?)就会停在那里。如果我回到原始代码,我将继续收到错误消息。请帮忙。
答案 0 :(得分:1)
问题很可能是因为两件事:
您将数组拼接在一个循环中,该循环遍历所述数组。
如果您要这样做,您应该向后迭代,这样就不会搞砸索引。
例如,让我们说
zombieCount
有3个元素。第一次迭代zo = 0
,让我们说你的命中测试成功,你拼接数组,现在zombieCount
有2个元素。下一次迭代zo=1
,但以前由zombieCount[1]
引用的项实际上是zombieCount[0]
。所以你最终跳过了一件物品。
bu
因此问题而变得超出范围。例如,让我们说
bullets
数组有2个元素,而你的僵尸数组有3
个元素。第一次迭代bu
是0
,让我们说命中测试成功在阵列中的第一个僵尸上。所以你拼接bullets
,现在有1个元素。让我们说数组中的第二个僵尸也通过了最热门的测试。现在再次拼接bullets
,除了它是第二个最终拼接的项目。让我们说数组中的第三个僵尸也传递了hitest,现在bullets
数组中没有任何东西,但你还是试图拼接它并从舞台上删除不存在的对象。 / p>
请改为尝试:
//iterate backwards, so if you remove an item from the array, it's always the last item and won't throw off order of the array
for(var bu:int = bullets.length-1;bu >= 0; bu--){
for(var zo:int = zombieCount.length-1;zo >= 0; zo--){
if (bullets[bu].hitTestObject(zombieCount[zo])) {
//remove the zombie
stage.removeChild(zombieCount[zo]);
zombieCount.splice(zo, 1);
//remove the bullet
stage.removeChild(bullets[bu]);
bullets.splice(bu, 1);
trace("hot hit");
break; //break out of this inner loop (through all zombies), since the bullet has been destroyed
}
}
}