制作平台游戏,需要停止运行的方法

时间:2012-03-13 20:25:28

标签: actionscript-3 flash

我正在制作一个平台游戏。

我有一个目标类(包含目标精灵代码的类,当你点击它时,它会继续下一部分游戏)。

在目标构造函数中,添加了2个事件侦听器,它们如下:

addEventListener(Event.ADDED, beginClass);
addEventListener(Event.ENTER_FRAME, eFrame);

beginClass函数很好,只运行一次,但是eFrame会检查玩家是否达到目标,因此它会一直运行。问题是,一旦玩家击中目标,eFrame将继续运行,同时在菜单中向玩家描述下一个场景。我的eFrame功能如下。

    private function eFrame(event:Event):void{
        if(hitTestObject(_root.mcMain)){
            var lastScore:int = _root.mainScore;
            _root.mainScore = lastScore;
            while (_root.lvlHolder.numChildren > 0) {
                    _root.lvlHolder.removeChildAt(0);
            }
            _root.mcMain.removeChildAt(0);
            _root.isInCut = true;
            if (_root.lvlCurrent == 1) {
                _root.gotoAndStop(2);
            } else if (_root.lvlCurrent == 2) {
                _root.gotoAndStop(3);
            } else if (_root.lvlCurrent == 3) {
                _root.gotoAndStop(4);
            }
        }
    }

第2,3,4帧是仅包含文字的框架和向玩家显示消息的按钮,然后玩家继续点击。我的问题是eFrame仍在尝试运行,但该类尚未实例化,并且该方法在玩家继续时会导致极大的延迟。

3 个答案:

答案 0 :(得分:2)

内幕目标,_root的重点是什么?

无论如何,这就是我所做的: 将事件ADDED更改为ADDED_TO_STAGE,这样,当事件被触发时,我们知道此Sprite具有stage属性。

addEventListener(Event.ADDED_TO_STAGE, beginClass);

从构造函数中删除eFrame事件。使用beginClass将其添加到stage,如下所示:

stage.addEventListener(Event.ENTER_FRAME, eFrame);

现在在eFrame中,您可以通过舞台参考来删除该事件。它之前没有用,因为引用是错误的(无论_root变量是什么)。

stage.removeEventListener(Event.ENTER_FRAME, eFrame);

但是 - 记得在代码的这一部分之前完成:

while (_root.lvlHolder.numChildren > 0) {
    _root.lvlHolder.removeChildAt(0);
}

因为当精灵被移除时,它将不再具有stage属性。请记住在所有可能的情况下清理事件。我不完全确定stage是放置输入框架事件的正确位置,我只是假设因为你之前称之为_root。

答案 1 :(得分:0)

在eFrame()内部停止事件监听器:

removeEventListener(Event.ENTER_FRAME,eFrame);

答案 2 :(得分:0)

你要将eventListener添加到舞台上,所以试试这个:

stage.removeEventListener(Event.ENTER_FRAME, eFrame);

parent.removeEventListener(Event.ENTER_FRAME, eFrame);

event.target.removeEventListener(Event.ENTER_FRAME, eFrame);