ENTER FRAME在没有错误的情况下停止工作



ENTER_FRAME何时停止
1.removeEventListener(Event.ENTER_FRAME,abc)
2.发生错误或闪存崩溃
3.类的实例从阶段中删除
4.

故事:
我有几个游戏的AS文档,其中一个包含添加敌人的ENTER_FRAME
它通常工作得很好,但有时它不再召唤敌人了。我没有更改任何内容,我只是按Ctrl+enter再次测试
我用trace检查过,发现ENTER_FRAME停止了
否则,我将trace放入ENTER_FRAME的另一个AS文件中,它一直在运行
levelmanage类中的另一个ENTER_FRAME用于测试它是否工作,它和addEventListener(Event.ENTER_FRAME, process);也都停止了我也没有任何错误,我仍然可以通过键移动我的对象
levelmanage类不连接到任何对象,如果舞台上的任何东西都被删除了,它就不应该停止
可能是什么问题?

以下代码是停止操作的代码。

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.*;
    public class levelmanage extends MovieClip
    {
        var testing:int=0
        private var sttage = ninelifes.main;
        public var framerate = ninelifes.main.stage.frameRate;
        public var levelprocess:Number = 0;
        public var levelprocesss:Number = 0;
        private var level:int;
        public var randomn:Number;
        public function levelmanage(levell:int)
        {
            level = levell;
            addEventListener(Event.ENTER_FRAME, process);
        }
        function process(e:Event)
        {
            testing+=1
            if(testing>200){
                testing=0
                trace("working")//it don't trace "working"sometimes which means enterframe doesn't going
            }
            if (levelprocess>levelprocesss)trace(levelprocess);
            levelprocesss = levelprocess;
            if (levelprocess>=100 && enemy.enemylist.length==0)
            {
                finish();
                return();
            }
            if (levelprocess<=100 && enemy.enemylist.length<6)
            {
                switch (level)
                {
                    case 1 :
                        arrange("cir",0.5);
                        arrange("oblong",1);
                        break;
                }
            }
            }
        public function arrange(enemyname:String,frequency:Number)
        {
            randomn = Math.random();
            if (randomn<1/frequency/framerate)
            {
                var theclass:Class = Class(getDefinitionByName(enemyname));
                var abcd:*=new theclass();
                sttage.addChild(abcd);
                trace("enemyadded")
                switch (enemyname)
                {
                    case "cir" :
                        levelprocess +=  5;
                        break;
                    case "oblong" :
                        levelprocess +=  8;
                        break;
                }
            }
        }
        private function finish()
        {
            levelprocess=0
            trace("finish!");
            removeEventListener(Event.ENTER_FRAME,process);//not this one's fault,"finish" does not appear.
            sttage.restart();
        }
    }
}

有可能你最终达到"levelprocess==100"one_answers"敌人.敌人列表.长度==0"条件,这会导致你的等级同时结束并有机会产生更多敌人,这显然是一种异常情况。这可能是你错误的原因,尽管运气不好。快速解决方法是在调用finish()之后立即插入一个"return;"。也有可能您的"levelmanage"对象以某种方式从stage中删除,并停止接收进入帧事件,这可能是由单个对象抛出两个"sttage.restart()"调用触发的。在"流程"函数中的任何时候检查此条件是否为真,并检查与此行为的相关性。并尽一切可能消除这种情况的可能发生。

if(testing>200){
                testing=0
                trace("working")//it don't trace "working"sometimes which means enterframe doesn't going
            }

你评论中的推论不正确。这意味着要么EnterFrame没有启动,要么testing <= 200

试着在process函数的开头添加一个跟踪。

如果你在其他地方没有removeEventListener,那么EnterFrame不太可能真的停止了——从你发布的例子中很难确定,但我敢打赌问题出在你的逻辑中,而不是EnterFrame事件本身的问题。

最新更新