2012-01-01 12 views
0

2日間の試行と回答の検索の後、まだそれを見つけられませんでした。私はエラー#2025を取得し続ける:提供されたDisplayObjectは、呼び出し側の子でなければならない。私は、ユーザーが敵に当たった場合、敵が破壊されるゲームを作っています。コード:AS3 - エラー#2025:提供されたDisplayObjectは発信者の子である必要があります

私の主なクラス

package classes 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.utils.Timer; 

public class Main extends MovieClip 
{ 
    var enemyTimer:Timer; 

    public function Main() 
    { 
     var user:ship = new ship(); 
     addChild(user); 
     user.name = "user"; 
     user.initialize(); 

     enemyTimer = new Timer(2000); 
     enemyTimer.addEventListener("timer", sendEnemy); 
     enemyTimer.start(); 

     function sendEnemy(e:Event) 
     { 
      var badboy:enemy = new enemy(); 
      addChild(badboy); 
      badboy.initialize(); 
     } 
    } 
} 
} 

敵クラスが

package classes.enemy 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 

public class Enemy extends MovieClip 
{ 
    var speed:Number; 

    public function initialize() 
    { 
     addEventListener("enterFrame", enterFrame); 
    } 

    public function Enemy() 
    { 
     this.x = 700; 
     this.y = Math.random()*200 + 50; 
     speed = Math.random()*5 + 5; 
    } 

    function enterFrame(e:Event) 
    { 
     this.x -= speed; 

     if(this.hitTestObject(parent.getChildByName("user"))) 
     { 
      kill(); 
     } 
    } 

    function kill() 
    { 
     removeEventListener("enterFrame", enterFrame); 
     stage.removeChild(this); 
    } 
} 
} 

ファイルを別のフォルダにある(クラス> Main.as & classes.enemy.Enemy.as)、ドンそれがそれと関係があるかどうかは分かりません。

ご協力いただければ幸いです。

答えて

4

あなたはstageから敵のMovieClipを削除しようとするので、それは(直接の)子ではないことを、おそらくだことの。

私はあなたがこの変更を提案

:これまで

stage.removeChild(this); 

を:

this.parent.removeChild(this); 

あなたがたDisplayObjectへの参照を持っている場合は、このケースでthisのように、あなたは常にその親からそれを削除することができますあなたがその親が何であるかわからなくても。あなたはそれが表示リストにある知っていればというか、あなたはそれを削除することができますので、あなたも最初行うことで、それがあることを確認できます。私は解決策を持っている

if(this.parent) { 
    this.parent.removeChild(this); 
} 
+0

確かに(これは私がコードで忘れた別の問題です) – iND

+0

これは、感謝しました! –

0

私は方法を間違えたと思います。このリビジョンが役立つかどうかを確認してください。 (また、これは最終的に問題にされる、オブジェクトのクリーンアップが含まれていないことに注意してください。)

package classes 
{ 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.utils.Timer; 

public class Main extends MovieClip 
{ 
    public var enemyTimer:Timer; 
    public var user:ship = new ship(); 
    public var badboy:enemy = new enemy(); 

    public function Main() 
    { 
     user = new ship(); 
     addChild(user); 
     user.name = "user"; 
     user.initialize(); 

     enemyTimer = new Timer(2000); 
     enemyTimer.addEventListener("timer", sendEnemy); 
     enemyTimer.start(); 

    } 


    // *** I moved this out of the constructor: 
    public function sendEnemy(e:Event):void 
    { 
     badboy = new enemy(); 
     badboy.name = "badboy"; // you probably have to make this unique, though. 
     addChild(badboy); 
     badboy.initialize(); 
    } 
} 
} 
+0

でも同じエラーが発生します。 –

+0

申し訳ありません - あなたが 'user'と' badboy'で範囲の問題を抱えていることに気付かなかった。それらをクラス変数にしました。 – iND

+0

ああ、名前でオブジェクトを呼び出すのが分かります。 。 。あなたはそれらに名前をつけなければなりません。編集を参照してください。 – iND

1

:ちょうどスクリプトをコピーして貼り付け、舞台や図書館には必需品のシンボルをほとんど作りません。次に、それを確認します。

import flash.display.MovieClip; 

var myArr:Array = []; 
abc.startDrag(true); 
var mymc:MovieClip = new MovieClip(); 
addChild(mymc); 

init(); 

function init() 
{ 
    for (var i=0; i<25; i++) 
    { 
     var par:Particle = new Particle(); 
     par.x = Math.random() * stage.stageWidth; 
     par.y = Math.random() * stage.stageHeight; 
     mymc.addChildAt(par,0); 
     myArr.push(par); 
    } 
    this.addEventListener(Event.ENTER_FRAME, hitTes); 
} 

function hitTes(e:Event):void 
{ 
    for (var j=0; j<myArr.length; j++) 
    { 
     if (abc.hitTestObject(myArr[j])) 
     { 
      if (myArr[j].parent) 
      { 
       myArr[j].parent.removeChild(myArr[j]); 
      } 

     } 
    } 
} 
関連する問題