3

好的,所以我已经坚持了大约三个小时了,我终于想寻求帮助。

基本上,当我的玩家飞船与其中一个接触时,我试图从屏幕上移除所有敌人对象实例,因为他随后失去了生命并被放回屏幕上的安全位置。

编辑:这是我的 Enemy Dude .as 文件中的所有代码,可能有点过火,但尽管如此。

package
{
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    public class Enemydude extends MovieClip
    {
        private var _root:Object;
        private var speed:int = 6;
        private var shipps = this
        public function Enemydude()
        {
            addEventListener(Event.ADDED, beginclass);
            addEventListener(Event.ENTER_FRAME, entFrame);
        }

        private function beginclass(event:Event):void
        {
            _root = MovieClip(root);
        }

        private function entFrame(event:Event):void
        {
            x -= speed;
            if(this.x < -64)
            {
                removeEventListener(Event.ENTER_FRAME, entFrame);
                _root.removeChild(this)
            }
            if(_root.gameover)
            {
                x = -700
                removeEventListener(Event.ENTER_FRAME, entFrame);
                removeEventListener(Event.ADDED, beginclass);
            }
            for (var i:int = 0; i<_root.playerBulletContainer.numChildren; i++)
            {
                var bulletTarget:MovieClip = _root.playerBulletContainer.getChildAt(i)
                if (hitTestObject(bulletTarget))
                {
                    removeEventListener(Event.ENTER_FRAME, entFrame);
                    _root.removeChild(this);
                    _root.playerBulletContainer.removeChild(bulletTarget);
                    bulletTarget.removeListeners();
                    _root.Score += 10
                    makeExplosion();
                }
            }
            if(hitTestObject(_root.mcship))
            {
                makeExplosion();
                shipPos();
                removethis();
            }

        }
        private function makeExplosion() 
        {
            var sndExplode:snd_explosion1;
            var sndExplodeChannel:SoundChannel;
            sndExplode=new snd_explosion1();
            sndExplodeChannel=sndExplode.play();
            var newExplosion01:explosionEffect=new explosionEffect  ;
            newExplosion01.x=this.x;
            newExplosion01.y=this.y;
            _root.explosionContainer.addChild(newExplosion01);

        }
        private function shipPos()
        {
            _root.lives -= 1;
            _root.mcship.x = 80;
            _root.mcship.y = 225;
            for each(var i:Enemydude in _root.enemies)
        {
            removethis();
        }

        _root.enemies.length = 0;
        }
        public function removethis():void
        {
            if(parent) parent.removeChild(this)
            removeEventListener(Event.ENTER_FRAME, entFrame);
        }
    }
}

编辑:这是我现在拥有的与我的主要时间线中的 Enemydude 相关的代码,对这一切感到非常抱歉。

var enemies:Array = [];
var Shipheight:Number = 300;
var Enemytime:int = 0;
var Enemylimit:int = 16;

    if (Enemytime<Enemylimit)
        {
            Enemytime ++;
        }
        else
        {
            var newEnemy01 = new Enemydude();
            newEnemy01.y = Shipheight;
            newEnemy01.x = stage.stageWidth + 64;
            addChild(newEnemy01);
            enemies.push(newEnemy01);
            Enemytime = 0

function shipY(event:Event):void
{
    Shipheight = Math.ceil(Math.random()* 250) + 80;
}

提前感谢您的帮助,感谢您的任何建议。

4

2 回答 2

1

我建议将你的敌人存储在一个数组中。

例如,创建数组enemies

var enemies:Array = [];

然后将您的代码修改为:

else
{
    var newEnemy01 = new Enemydude();

    newEnemy01.y = Shipheight;
    newEnemy01.x = stage.stageWidth + 64;

    addChild(newEnemy01); 
    enemies.push(newEnemy01);

    Enemytime = 0;
}

这样你就可以使用这个新数组移除所有敌人:

for each(var i:Enemydude in enemies)
{
    i.remove(); // Or whatever function Enemydude has to remove itself.
}

// Empty the enemies Array.
enemies.length = 0;

这是.remove()您可以使用的方法Enemydude

public function remove():void
{
    if(parent) parent.removeChild(this);

    // Remove any event listeners etc from this object.
}
于 2012-06-25T01:19:47.060 回答
1

一种常见且简单的方法是创建一个子容器来保存对象并销毁该对象。它也使一些碰撞检查变得容易,因为您可以使用持有者对象对玩家进行一次检查。

如果您不想创建它,您可以使用数组或向量来存储对此对象的引用,这样可以轻松遍历列表。

我个人推荐矢量aprouch:

var enemyList:Vector.<Enemy> = new Vector.<Enemy>();

然后你可以像一个数组一样循环(正如 Marty Wallace 在他的回答中所展示的那样):

for each(var e:Enemy in enemyList) {
    container.removeChild(e);
}
enemyList.length = 0; // empty vector

向量比普通数组慢一点,但类型安全。在大多数情况下,性能差异几乎可以忽略不计。

于 2012-06-25T01:55:54.347 回答