我有一个问题。每五秒钟就会激发spawnEnemies。它创建一个movieclip,设置它的位置并将其添加到舞台和数组中。在函数checkBullet中,我检查子弹是否击中了其中一个敌人。如果是这样,子弹和敌人将从舞台上移除,敌人将从阵列中拼接出来。但是一旦我击中敌人就会抛出错误:
TypeError:错误#1010:术语未定义且没有属性。
如果我注释掉arrayEnemies.splice(i,1)行,它可以正常工作但不会从数组中删除它。这本身不是问题,但我自然不喜欢在我的数组中保留不必要的数据。对此有何帮助?
function checkBullet(event:Event) {
if(stage.contains(mcBullet)) {
for(var i:int = 0; i < arrayEnemies.length; i++) {
if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
stage.removeChild(mcBullet);
this.removeChild(arrayEnemies[i]);
arrayEnemies.splice(i,1);
bulletOnStage = false;
}
}
if(mcBullet.x > 800) {
stage.removeChild(mcBullet);
bulletOnStage = false;
}
}
}
function spawnEnemies(event:TimerEvent) {
var enemie:MovieClip = new box_mc();
enemie.name = "mcBox" + event.currentTarget.currentCount;
enemie.x = 850;
enemie.y = Math.floor(Math.random()*(1+155)+255);
addChild(enemie);
arrayEnemies.push(enemie);
}
function moveEnemies(event:Event) {
for(var i:int = 0; i < arrayEnemies.length; i++) {
arrayEnemies[i].x -= 5;
}
}
答案 0 :(得分:0)
这是因为处理你正在迭代的数组引起的,你应该对你要删除的东西进行引用,然后在循环之后再进行。
答案 1 :(得分:0)
你的问题是,如果子弹击中两个敌人,你试图将它从舞台上移除两次。这将抛出ArgumentError。
如果你需要对所有敌人进行测试(假设同一个子弹可以击中多个敌人),你还需要在从敌人阵列中移除一个元素时减少我。
function checkBullet(event:Event) {
if(stage.contains(mcBullet)) {
if(mcBullet.x > 800) {
stage.removeChild(mcBullet);
bulletOnStage = false;
}
for(var i:int = 0; i < arrayEnemies.length; i++) {
if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
if(stage.contains(mcBullet)){
stage.removeChild(mcBullet);
}
this.removeChild(arrayEnemies[i]);
arrayEnemies.splice(i,1);
bulletOnStage = false;
i--;
}
}
}
}
答案 2 :(得分:0)
一个较旧的问题,但我想我也会对那些可能会在这里结束的人提出我的回答 就像Neil所说的那样,编辑一个你正在通过的数组(在这种情况下是arrayEnemies)会导致并发更新问题。
我首选的解决方案是使用单独的toRemove数组并在更新后删除它们,例如:
var enemies:Array();
//Lets assume at some point this is populated with Enemy objects
function update():void
{
var toRemove:Array = new Array();
//May want to keep and clear an array instead to avoid creating a new one each update
foreach(var enemy:Enemy in enemies)
{
enemy.update();
if(enemy.markedForRemoval())
toRemove.push(enemy);
}
foreach(var enemy:Enemy in toRemove)
enemies.splice(enemies.indexOf(enemy), 1);
}