AS3 - Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне - PullRequest
0 голосов
/ 02 января 2012

После 2 дней попыток и поиска ответа я так и не нашел его.Я продолжаю получать сообщение об ошибке # 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), не знаю, имеет ли это какое-либо отношение к этому.

Буду признателен за любую помощь.

Ответы [ 3 ]

4 голосов
/ 02 января 2012

Это, вероятно, потому, что вы пытаетесь удалить Enemy MovieClip из stage, который не является (прямым) потомком.

Я предлагаю вам изменить это:

stage.removeChild(this);

к этому:

this.parent.removeChild(this);

Если у вас есть ссылка на DisplayObject, например this, в этом случае вы всегда можете удалить его из родительского объекта, даже если вы не знаете, что это за родительский объект. Или, скорее, вы можете удалить его, если знаете, что он есть в списке отображения, так что вы также можете сначала проверить его, выполнив:

if(this.parent) {
    this.parent.removeChild(this);
}
1 голос
/ 05 июня 2012

У меня есть решение: просто скопируйте и вставьте скрипт и создайте несколько основных символов на сцене и в библиотеке; затем проверьте это.

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]);
            }

        }
    }
}
0 голосов
/ 02 января 2012

Я думаю, что вы потеряли метод.Посмотрите, поможет ли эта ревизия.(Также обратите внимание, что это не включает в себя какую-либо очистку объектов, что в конечном итоге будет проблемой.)

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();
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...