3

さて、私はこれで約 3 時間立ち往生しており、ようやく助けを求めたい気分になりました。

基本的に、プレイヤーの船が敵オブジェクトの 1 つと接触すると、敵オブジェクトのすべてのインスタンスを画面から削除しようとしています。敵はライフを失い、画面上の安全な位置に戻されます。

編集: これは私の 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

これを行う一般的で簡単な方法は、サブコンテナを作成してオブジェクトを保持し、代わりにこのオブジェクトを破棄することです。ホルダー オブジェクトを使用してプレイヤーに対して 1 つのチェックを行うことができるため、一部の衝突チェックも簡単になります。

これを作成したくない場合は、配列またはベクトルを使用してこのオブジェクトへの参照を格納できます。これにより、リストを簡単にトラバースできます。

私は個人的にベクトルアプローチをお勧めします:

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 に答える