0

我有一个学生正在开发 AS3 中的塔防游戏,并且遇到了一个困扰我的问题。他正在使用 hitTestObject 来改变movieClip 移动的方向。影片剪辑有自己的时间线,其中包含对象所面对的不同方向的帧和一个链接的 .as 文件,其中包含对象行为的代码。

当他调用 gotoAndStop 改变movieClip的内部帧时,触发了removed事件,但是对象停留在屏幕上不再移动。

我的所有搜索都找到了有关删除对象的答案,但我没有看到任何有关防止对象删除自身的内容。

以下代码是由 .as 类文件中针对 movieClip 对象的 ENTER_FRAME 事件触发的循环:

private function eFrame(event:Event):void
    {

        if (_root.isPaused == false)
        {
            //MOVING THE ENEMY
            this.x +=  speed * xDir;
            this.y -=  speed * yDir;
            if (health <= 0)
            {
                _root.currency +=  4;

                this.parent.removeChild(this);
            }
            if (this.x > 770)
            {
                this.parent.removeChild(this);
                _root.health -=  10;
                _root.gotHit = true;
            }
            //checking if touching any invisible markers
            for (var i:int=0; i<_root.upHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var upMarker:DisplayObject = _root.upHolder.getChildAt(i);
                if (hitTestObject(upMarker))
                {
                    yDir = 1;
                    xDir = 0;
                    this.gotoAndStop(3);


                }
            }
            for (i=0; i<_root.downHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var downMarker:DisplayObject = _root.downHolder.getChildAt(i);
                if (hitTestObject(downMarker))
                {
                    yDir = -1;
                    xDir = 0;
                    this.gotoAndStop(7);

                }
            }

            for (i=0; i<_root.rightHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var rightMarker:DisplayObject = _root.rightHolder.getChildAt(i);
                if (hitTestObject(rightMarker))
                {
                    yDir = 0;
                    xDir = 1;
                    this.gotoAndStop(6);
                }
            }
            for (i=0; i<_root.leftHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var leftMarker:DisplayObject = _root.leftHolder.getChildAt(i);
                if (hitTestObject(leftMarker))
                {
                    yDir = 0;
                    xDir = -1;
                    this.gotoAndStop(2);

                }
            }
        }
    }
    private function remove(event:Event):void
    {
        trace("remove");
        removeEventListener(Event.ENTER_FRAME, eFrame);
        _root.enemiesLeft -=  1;

    }
}

当 gotoAndStop 行执行时,movieClip 的帧发生变化,然后代码直接跳转到由 REMOVED 事件触发的函数。

有谁知道为什么这个代码可能会触发 REMOVED 事件?

感谢您的帮助。

4

2 回答 2

1

如果我没记错的话,REMOVED 事件是由从包含它的 MovieClip 或 Sprite 的舞台上移除的任何东西触发的。特别是对于具有动画的 MovieClip,每次都会删除和添加内容,例如,如果动画的某些部分在时间轴上结束,或者在关键帧处结束。

Event.REMOVED_FROM_STAGE 仅在容器本身从阶段中移除时才被调度。也许这引起了你的困惑?我无法从您的代码示例中确切看到您正在侦听的事件类型。

于 2013-02-21T21:13:28.480 回答
0

您在哪里添加删除侦听器?

如果没有更多信息,我猜您正在收听动画中的剪辑,并且它并非在所有帧上都存在(或者,甚至更有可能 - 该实例正在被 flash pro 换成另一个相同的实例. 这可能会发生,具体取决于您添加关键帧的顺序、月球的对齐方式和电离层的波动。最简单的解决方法是删除所有关键帧,然后重新创建它们。然后永远不要使用 flash pro 做任何事情再次。)

于 2013-02-21T18:38:56.517 回答