首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3 -错误#2025:提供的DisplayObject必须是调用方的子级

AS3 -错误#2025:提供的DisplayObject必须是调用方的子级
EN

Stack Overflow用户
提问于 2012-01-02 04:27:41
回答 3查看 17.5K关注 0票数 0

经过两天的尝试和寻找,我仍然没有找到答案。我一直收到错误#2025:提供的DisplayObject必须是调用者的子级。我正在做一个游戏,如果用户击中一个敌人,敌人就会被摧毁。代码:

我的主类

代码语言:javascript
复制
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();
        }
    }
}
}

敌方阶级

代码语言:javascript
复制
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);
    }
}
}

这些文件位于不同的文件夹中(classes > Main.as & classes.enemy.Enemy.as),不知道这是否与此有关。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-02 05:59:33

这可能是因为您试图从stage中删除Enemy MovieClip,它不是(直接)子对象。

我建议你改变这个:

代码语言:javascript
复制
stage.removeChild(this);

要这样做:

代码语言:javascript
复制
this.parent.removeChild(this);

当您拥有对DisplayObject的引用时,即使您不知道父对象是什么,也可以将其从其父对象中删除,比如本例中的this。或者,如果您知道它在显示列表中,则可以将其删除,因此您还可以通过执行以下操作,首先检查它是否在显示列表中:

代码语言:javascript
复制
if(this.parent) {
    this.parent.removeChild(this);
}
票数 4
EN

Stack Overflow用户

发布于 2012-06-05 21:51:23

我已经有了解决方案:只需复制并粘贴脚本,并在舞台和库中创建一些基本符号;然后,检查它。

代码语言:javascript
复制
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]);
            }

        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-01-02 05:31:35

我想你把一个方法放错地方了。看看这个版本是否有帮助。(还要注意,这不包括对对象的任何清理,这最终将是一个问题。)

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8695326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档