我的对象不会被删除数组

时间:2012-11-09 19:19:45

标签: actionscript-3 flash

问题是,当我击落我的敌人时,他会不断重新产卵。 可能是我忽视的东西。

我可以拍摄它,它会从舞台上移除但是会被重新渲染,因为它仍然存在于我的阵列中。

感谢

private function enemySpawnen():void
    {           
        for(var i:uint = 0; i < hoeveelheidEnemy;i++){
            var enemyShip:SpaceShip = new SpaceShip();
            Enemy[i] = enemyShip;
        }
    }

private function renderEnemy(e:Event):void
    {           
        for(var i:uint = 0; i < hoeveelheidEnemy;i++){              
            if(Enemy[i] != null){
                viewContainer.addChild(Enemy[i]);

                Enemy[i].scaleX = 0.5;
                Enemy[i].scaleY = 0.5;

                Enemy[i].x = 500;
                Enemy[i].y = 400 - i*100;
        }
        }
    }

function shoot(e:Event):void
            {
                kogel.x +=10;

                try{
                    for(var i:uint = 0; i < hoeveelheidEnemy;i++){
                        if(kogel.hitTestObject(Enemy[i])){

                            Enemy.splice(i,0);==>problem when i set it to 1 or i then nothing happens
                            viewContainer.removeChild(Enemy[i]);
                            //trace("hit");
                        }
                    }
                }
                catch(e:Error){

                }
            }

我的源代码可以在这里找到:http://dl.dropbox.com/u/50815831/Nieuwe%20map.zip

1 个答案:

答案 0 :(得分:1)

您需要在拼接阵列之前移除子节点。您还需要向后迭代,以便您的索引不会更改中间循环。

尝试将for循环更改为以下内容:

for(var i:uint = Enemy.length-1; i >= 0;i--){
    if(kogel.hitTestObject(Enemy[i])){
        viewContainer.removeChild(Enemy[i]);
        Enemy.splice(i,1); //do this after the above line, otherwise you're actually removing doing removeChild on the next item in the array
        kogel.removeEventListener(Event.ENTER_FRAME, shoot); //stop the frame handler
        break; //abandon the rest of this loop
    }
}

如果Kogel是子弹并且你希望它只影响一个敌人,那么你需要在它破坏某些东西后突破它。

作为良好实践的提示。你应该将射击功能/输入帧处理程序封装到你的Kogel类中,然后传入敌人阵列。

我注意到的其他事情,你的renderEnemy函数每帧运行一次,这是完全不必要的,并导致不希望的定位。一起删除该函数并将代码放入enemySpawned()方法:

private function enemySpawnen():void
    {
        for(var i:uint = 0; i < hoeveelheidEnemy;i++){
            var enemyShip:SpaceShip = new SpaceShip();
            Enemy[i] = enemyShip;
            viewContainer.addChild(Enemy[i]);

                Enemy[i].scaleX = 0.5;
                Enemy[i].scaleY = 0.5;

                Enemy[i].x = 500;
                Enemy[i].y = 400 - i*100;
        }
    }