AS3 ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子级

时间:2017-04-23 05:21:22

标签: actionscript-3 flash

我正在做一个小型游戏。我的仆从的实例名称是sideMinion。香蕉正在下降,一切正常,但我的removeChild()无法正常工作。我得到的错误是

  

错误#2025:提供的DisplayObject必须是调用方的子级。   removeChild()或hitTestObject无法正常工作。

这就是我在香蕉中所拥有的。类:

    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();

编辑:格式代码

1 个答案:

答案 0 :(得分: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);
    }
}

反转循环明显地从最后一个元素一直循环到第一个元素,因为如果你从数组中删除第一个元素,那么第二个元素就会跳过&#39;进入它的位置并循环将跳过它。

我希望我们所有人都能很快看到你的游戏! :)