在 Actionscript 3.0 中删除子级

Posted

技术标签:

【中文标题】在 Actionscript 3.0 中删除子级【英文标题】:Removing Childs in Actionscript 3.0 【发布时间】:2018-05-17 08:19:26 【问题描述】:

这是我的第一个问题,但我最近一直遇到这个问题,需要一些帮助。

我正在为周末编写一个小型 android 游戏,但我无法让我的飞船的子弹击中敌人并同时消失...

我会给你们简要介绍一下我的代码:

stage.addEventListener(Event.ENTER_FRAME, Update);
LeftButton.addEventListener(TouchEvent.TOUCH_OVER, LBOn);
LeftButton.addEventListener(TouchEvent.TOUCH_BEGIN, LBTouch);
LeftButton.addEventListener(TouchEvent.TOUCH_OUT, LBOff);
LeftButton.addEventListener(TouchEvent.TOUCH_END, LBRelease);
RightButton.addEventListener(TouchEvent.TOUCH_OVER, RBOn);
RightButton.addEventListener(TouchEvent.TOUCH_BEGIN, RBTouch);
RightButton.addEventListener(TouchEvent.TOUCH_OUT, RBOff);
RightButton.addEventListener(TouchEvent.TOUCH_END, RBRelease);
BA.addEventListener(TouchEvent.TOUCH_BEGIN, Shoot);

这是我舞台的事件监听器块。当前所有的 EventListeners 都在这个小部分中,非常简单,它们可以正常工作,但最后一个事件调用了函数 Shoot,这就是事情变得棘手的地方......

function Shoot(TouchEvent) 

        SpawnBullet();

    ;

好的,很简单。只是一个调用另一个函数来生成我的子弹的函数,在我看来并没有太大的危害......

这就是我试图让代码运行的方式:

function SpawnBullet() 

        var Bullet:Bullet1 = new Bullet1();
        stage.addChild(Bullet);

            Bullet.x = Player.x;
            Bullet.y = Player.y - (Player.height / 2);

                Bullet.addEventListener(Event.ENTER_FRAME, BulletUpdate);

                    function BulletUpdate(Event) 

                        Bullet.y -= 20;

                        if(Bullet.y <= 100) 

                            Bullet.removeEventListener(Event.ENTER_FRAME, BulletUpdate);
                            stage.removeChild(Bullet);
                            Bullet = null;

                        ;

                    ;

    ;    

当我运行游戏时出现此错误:

ReferenceError: Error #1069: Property ENTER_FRAME not found on flash.events.Event and there is no default value.
at Function/Shooter_fla:MainTimeline/SpawnBullet/Shooter_fla:BulletUpdate()[Shooter_fla.MainTimeline::frame1:41]

我并没有试图伪造我的技能,我认为我不了解添加和删除 childs 的工作原理,并且因为我讨厌只是在网上搜索一种方法来做某事而不学习某事的工作方式,所以我来这里寻求帮助。提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

该错误与添加/删除子级无关。您的错误是声明函数参数 Event 与类名同名,因此编译器会感到困惑。另外,作为旁注,尽量避免在函数内部声明函数,这就像欢迎痛苦和恐惧。

我认为您的代码如下所示:

function SpawnBullet():void

    // With the "new" operator you can omit () if constructor has no arguments.
    var aBull:Bullet1 = new Bullet1;

    stage.addChild(aBull);

    aBull.x = Player.x;
    aBull.y = Player.y - (Player.height / 2);

    aBullet.addEventListener(Event.ENTER_FRAME, BulletUpdate);


function BulletUpdate(e:Event):void

    // Get the reference to the bullet from the event.
    // Alternately you might store it in a variable outside of both functions.
    var aBull:Bullet1 = e.target as Bullet1;

    aBull.y -= 20;

    if (aBull.y <= 100)
    
        aBull.removeEventListener(Event.ENTER_FRAME, BulletUpdate);
        stage.removeChild(aBull);
    

P.S. 不要羞于彻底格式化您的代码。它并没有看起来那么麻烦,很快你就会养成它的习惯,而格式化的代码干净易读,并且只要正确格式化就可以避免一些错误。

【讨论】:

好的,非常感谢先生!我现在就洗个澡,试试你解决我问题的方法。关于代码格式,我尝试将所有内容保存在块中,以便我可以轻松阅读关于什么的部分,我认为这对我的眼睛和组织来说更容易,但我不知道在函数内部声明函数是不好的,所以我现在也会记住这一点。另外,你介意告诉我“e.target as Bullet1;”是什么吗?做?我从来没有使用过“as”命令,所以... @Wobbufest 这是一种类型转换。基本上,您向编译器解释 “此引用属于 Bullet1 类,而不仅仅是您可能认为的普通 Object。这并不总是必要的(在您的代码中,可以将 aBull 声明为 DisplayObject),但有时编译器会更好地了解预期或不预期对您有好处期望您正在处理的对象。您可以阅读更多关于 as 的信息:***.com/questions/12390347/…***.com/questions/14268329/as3-cast-or-as 首先,感谢as 的解释,它真的帮助了我。其次,我刚刚尝试了代码并且遇到了同样的问题,这是我的 BulletUpdate 事件:' function BulletUpdate(Event) var ThisBullet:Bullet1 = Event.currentTarget as Bullet1; ThisBullet.y -= 20; if(ThisBullet.y 另外,我将 SpawnBullet() 和 BulletUpdate() 分成两个独立的函数,正如您指出的那样,这是最好的做法。 @Wobbufest 从您提供的函数体中,我看到没有复制我的代码,而且您似乎没有阅读我的解释,这就是为什么您仍然遇到相同的错误,这就是结果与您的相同错误脚本。

以上是关于在 Actionscript 3.0 中删除子级的主要内容,如果未能解决你的问题,请参考以下文章

[ActionScript 3.0] AS3 对XML的操作,创建删除增加节点方法

在 ActionScript (3.0) 中干净地合并两个数组?

[ActionScript 3.0] AS3.0 水面波纹效果

如何在 Actionscript 3.0 中获取数组的所有排列?

[ActionScript 3.0] AS3.0根据当天日期获取明天,后天...日期

如何在Actionscript 3.0中获取数组的所有排列?