在Actionscript 3.0中删除Childs

时间:2017-12-03 21:48:37

标签: android actionscript-3 actionscript removechild addchild

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

我周末编写了一个小小的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);

这是我的Stage的事件监听器块。所有当前的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]

我没有试图伪造我的技能,我想我不理解添加和删除孩子的工作方式,因为我讨厌在网上搜索某种方法而不学习一些有效的方式我来到这里是为了一点帮助。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

该错误与添加/删除子项无关。你的错误是声明函数参数事件,其名称与类名相同,因此编译器会混淆。另外,作为旁注,尽量避免在函数内部声明函数,这就像欢迎痛苦和恐怖一样。

我认为你的代码会很好,如下:

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。不要羞于彻底格式化您的代码。它看起来并不是那么麻烦,很快你就会习惯它,而格式化的代码很干净,可读,只需正确地进行格式化就可以避免一些错误。