1

AS3 を使用して小さなフラッシュ ゲームを構築しようとしています。モブをステージに追加し、殺されたら削除するために配列に保存します。ただし、次のエラーが発生し続けます: TypeError: エラー #2007: パラメータの子は null 以外である必要があります。

これは現在私のコードです:

myMobsBuilder();
var mobsArray:Array = new Array();

function myMobsBuilder():void{
    for(var i:Number=0; i<3; i++){
        this["myMob"+i+":MovieClip"] = new mob();
    lvlHolder.addChild(this["myMob"+i]);
    myMob.x = 200;
    myMob.y = 200;
    mobsArray[i] = myMobs;
    }
}

モブの新しいインスタンスごとに変数名を動的に作成しようとしていることに注意してください。上記の暴徒のムービー クリップを、ステージ上の別のムービー クリップ lvlHolder に追加し、配置します。次に、そのムービー クリップを配列に追加します。これは、Mob が殺されたら、アレイとステージの両方からそれらを削除できるようにするためです。もちろん、それを行うためのより良い方法がない限り。変数名を動的に作成する、配列にムービークリップを追加および削除するなど、広範囲に調査しましたが、AS3 にはかなり慣れていませんが、これが私が思いつく最高のものです。

これについての助けをいただければ幸いです。

Ps。以下は、別の関数で使用している削除コードですが、これもうまく機能していません。

lvlHolder.removeChild(["myMob"+i]);
mobsArray.splice(i,1); 
4

3 に答える 3

2

あなたがやろうとしていることは本当に明確ではありません。this["myMob"+i+":MovieClip"] = new mob();これは有効ではありません (まあ、厳密に無効というわけではありませんが、あなたが考えていることにはなりません)。

これはうまくいくはずです(編集:優れたコーディング標準に準拠するようにコードを改善しました):

myMobsBuilder();
var mobsArray:Array = [];
//You can also use a vector here, for possibly improved speed and type safety.
//var mobsArray:Vector.<mob> = new Vector.<mob>();

function myMobsBuilder():void{
    for(var i:int=0; i<3; i++)
    {
        var tmpMob:mob = new mob();
        lvlHolder.addChild(tmpMob);
        tmpMob.x = 200;
        tmpMob.y = 200;
        mobsArray.push(tmpMob);
    }
}
于 2012-06-15T14:15:13.577 に答える
0

だから、私はあなたのループが配列を通過すると思いますか?

for (var i:int = 0; i < mobsAray.length; i++)
{
    var tempMob:mob = mobsArray[i];
    var j:int;

    if (tempMob is too weak to live) //pseudocode
    {
        //now we know which one to kill

        lvHolder.removeChild(tempMob);
        //remove it from view

        j = i;
        //remember its position in the array
    }

    //you can modify the array outside the loop
    mobsArray.splice(j,1);

    //I assumed that you can kill just one mob at the time
    //but if that's not the case you can store indexes in the array
    //and make another loop to remove these from mobsArray
}

ループ中は配列を変更しないように注意してください。

于 2012-06-15T16:02:08.403 に答える
0

配列の代わりに Sprite コンテナーを使用する方が簡単/効率的であることがわかる場合があります (ニーズと各「mob」の追跡方法によって異なります)。

var mobContainer:Sprite = new Sprite();
lvlHolder.addChild(mobContainer);
var tmpMob:mob;
for(var i:Number=0; i<3; i++){
    tmpMob = new mob();
    mobContainer.addChild(tmpMob);
    tmpMob.x = 200;
    Mob.y = 200;
}

次に、削除コード(mob クラス自体で発生した場合)には、 this.parent.removeChild(this)を使用します。配列と同じようにスプライトを扱います。

したがって、mob インスタンスの数を知る必要がある場合は、 mobContainer.numChildren (array.length の代わりに) とmobContainer.getChildAt(i)の代わりに array[i] を使用してください。

于 2012-06-15T17:16:35.027 に答える