0

引数エラー#2025:

提供されたDisplayObjectは呼び出し元の子ではありません

私のプログラムでは、画面上の敵ユニットを表す表示オブジェクトの構造が次のように配置されています。

0: "enemy handler" ➔ [object EnemyHandler]
  0: "enemy" ➔ [object Enemy1]
    0: "enemy's skin"(MovieClip) ➔ [object EnemySkin1]
      0: "skin image" ➔ [object Shape]

ドキュメントクラスには、EnemyHandlerの1つのインスタンスが含まれ、 Enemy1Enemy2などの複数のインスタンスが含まれます。これらの各インスタンスには、スキンMovieClipがアタッチされています。

Enemyクラス(Enemy1 / 2/3 ectが継承する)には、Enemyが特定のポイントに到達したときに、Enemyクラス(enemy.update)内からtrueに設定されたexpiredプロパティが含まれています。

敵のハンドラークラスには関数があり、問題が発生する場所であり、すべてのEnememy表示オブジェクトの配列をループし、そこで位置を更新してから、

if(tempEnemy.expired)
{
    tempEnemy.destroy();            // removeChild(skin)
    enemyList.splice(tempEnemy);
    removeChild(tempEnemy)
}

実行時に、すべての敵が作成された順序でエンドポイントに到達した場合、問題はありませんが、たとえば1つがより速く移動し、前にエンドポイントに到達した場合、エラー#2025(提供されたDisplayObjectは呼び出し元の子ではありません)がスローされます。

私はそれを、私が識別できない理由で、プログラムが敵を2回除去しようとするという事実に絞り込みました。ループして目的の敵を削除し、配列からスプライスされている場合でも、再度削除を試みます(これは正しく行われ、removeChildの最初の試行は常に成功します)

それはおそらく私に代わってかなり単純なことなので、私を許してください、しかしどんな助けでもありがたいです。これがファイルです。

[フレームのコード]pastebin.com/vcXzQpr9

[Enemy.as] pastbin.com/RNXgK8Ex

[EnemyHandler.as] pastbin.com/6fytxbMW

[Enemy0.as]&[Enemy1.as] pastbin.com/5bW3Aa0H

[Utils.as] pastbin.com/PQ2LPV0v

[traceDl.as]{ディスプレイリストのデバッグ}pastebin.com/9vQGKcYP

4

1 に答える 1

1

Array.splice()スプライシングを開始する位置に整数を取り、次に削除するアイテムの数を取ります。だからあなたは使う必要があります

enemyList.splice(enemyList.indexOf(tempEnemy), 1);

Enemyインスタンスを渡す代わりに。順序が変更されなかった場合は正しく機能しているように見えた可能性があります。これは、強制tempEnemyするとintsplice()自動的に行われる)ゼロが生成されるため、destroyEnemy関数では、実際には毎回リストの最初の項目を削除するだけでした。

于 2013-02-20T01:08:23.433 に答える