2017-04-23 10 views
0

私はミニオンゲームを作っています。私のミニオンのインスタンス名はsideMinionです。バナナが落ちていて、すべて正常に動作しますが、removeChild()は正しく動作しません。エラー#2025:提供されたDisplayObjectは呼び出し元の子でなければなりません。 removeChild()またはhitTestObjectが正しく機能しません。AS3 ArgumentError:エラー#2025:提供されたDisplayObjectは呼び出し元の子である必要があります

これは私がバナナのように持っているものです。クラス:

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

    public class banana extends MovieClip { 

     var velX: Number = 0; 
     var velY: Number = 0; 
     var falling: Boolean = false; 
     var gravity: Number = 0; 

     public function banana() { 
      var timing: Timer = new Timer(25, 0); 
      timing.addEventListener(TimerEvent.TIMER, moveMe); 
      timing.start(); 

     } 

     private function moveMe(event: TimerEvent) 
    { 
     x += velX; 
     y += velY; 

     if (falling) velY += gravity; 

     /* trace("[BANANA] position:", x, y, "speed:", velX, velY);*/ 
    } 


     public function setSpeed(dx,dy) { 
      velX = dx; 
      velY = dy; 
     } 

      public function setSpot(atX,atY){ 
      this.x=atX; 
      this.y=atY; 
     } 


     public function makeItFall(){ 
      falling=true; 
     } 


    } 

} 

そして、私のメインプログラムで:

import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 

var leftKey:Boolean; 
var rightKey:Boolean; 
var upKey:Boolean; 
var downKey:Boolean; 
var jump:Boolean = false; 
var xvelocity:int = 9; 
var yvelocity:int = 3; 
var gravity:Number = 7; 


stage.addEventListener(Event.ENTER_FRAME, changeVelocity); 
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyUp); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown); 

    function changeVelocity(evt:Event){ 
     moveMinion(); 
     yvelocity += gravity; 
    } 

    function moveMinion(){ 

     if (leftKey == true){ 
      sideMinion.x -= xvelocity; 
      sideMinion.left(); 

     } 
     if (rightKey == true){ 
      sideMinion.x += xvelocity; 
      sideMinion.right(); 
     } 

    } 

    function checkKeyDown(e:KeyboardEvent){ 
     if (e.keyCode == Keyboard.LEFT){ 
      leftKey = true; 
     } 
     else if (e.keyCode == Keyboard.RIGHT){ 
      rightKey = true; 
     } 

    } 

    function checkKeyUp(e:KeyboardEvent){ 
     if (e.keyCode == Keyboard.LEFT){ 
      leftKey = false; 
     } 
     else if (e.keyCode == Keyboard.RIGHT){ 
      rightKey = false; 
     } 

    } 

    btnStart.addEventListener(MouseEvent.CLICK, makeItFall); 

    function makeItFall(e:MouseEvent){ 



    var numBananas = 6; 
    var theBananas: Array = new Array(); 
    theBananas = []; 
    for (var i = 0; i < numBananas; i++) { 
    var aBanana: banana = new banana(); 
    theBananas.push(aBanana); 
    btnStart.visible=false; 
    aBanana.y=30; 
    theBananas[i].setSpot(Math.random()*450+50,Math.random()*200+20); 
    theBananas[i].setSpeed((Math.random()), 1); 
    stage.addChild(aBanana); 

} 

var health: uint= 1; 

addEventListener(Event.ENTER_FRAME, pickUpBananas); 

function pickUpBananas(event:Event){ 
    for(var i= 0; i<theBananas.length; ++i){ 
     if (sideMinion.hitTestObject(theBananas[i])){ 
      removeChild(theBananas[i]); 
      health=health+1; 
      trace(health); 
     } 
    } 

} 

    } 


stop(); 
+0

stage.addChild(... 'stage.removeChild(...'でもremoveChildを試してみましたが、削除したバナナをtheBananas配列から削除したいと思っているでしょうか?もしそうなら、 pickUp-loopにそれを含めてください。その場合は、ループを逆方向に実行するようにしてください。(i = theBananas.length-1; i> -1; i - ) – kaarto

答えて

1

あなたがステージに子を追加しているとして、あなたがステージからもそれを削除する必要があります:

stage.removeChild(theBananas[i]); 

将来のために実際の親を知らない場合は、親資産を使用することもできます。

theBananas[i].parent.removeChild(theBananas[i]); 

あなたのゲームでは、ステージからバナナを削除するときに、バナナ配列からバナナを削除して、配列がすでにバナナを削除してしまわないようにすることを前提としています。だから、ここのカップルの変更です:

for(var i:int = theBananas.length-1; i>-1; i--){ //inverted loop 
    if (sideMinion.hitTestObject(theBananas[i])){ 
     stage.removeChild(theBananas[i]); 
     theBananas.splice(i,1); //removing it from the array 
     health=health+1; 
     trace(health); 
    } 
} 

反転ループは明らかに2番目の要素は、その中に「ジャンプ」だろうそして、あなたは配列の最初の要素を削除したい場合becouse、最後の要素から最初の1までずっとループplaceとloopはそれをスキップします。

私たちは皆、あなたのゲームをすぐに見に行くことを願っています! :)

+0

ありがとうございます。本当に意味をなさないです。私はあまりにもすべての人がゲームを見ることを願っています:) – Catalina

関連する問題