0

什么时候ENTER_FRAME停止?
1. removeEventListener(Event.ENTER_FRAME,abc);
2. 发生错误或flash 崩溃
3. 类的实例从阶段
4 中删除。 ?

故事:
我有几个游戏的AS文件,其中一个包含ENTER_FRAME添加敌人的内容。
它通常工作正常,但有时它不再召唤敌人了。我没有改变任何东西,我只是按 Ctrl+enter 再次测试。
我曾经trace检查过,并找到了ENTER_FRAME停靠点。
否则,我放入trace另一个AS文件ENTER_FRAME,它继续运行。
levelmanage 类中的另一个ENTER_FRAME用于测试它是否正常工作,无论是它还是addEventListener(Event.ENTER_FRAME, process);停止我也没有收到任何错误,我仍然可以通过键移动我的对象。
levelmange 类不连接到任何对象,如果舞台上的任何东西被移除,它不应该停止。
可能是什么问题呢?

下面的代码是停止运行的代码。

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();
        }
    }
}
4

2 回答 2

1

您最终可能会遇到“levelprocess==100”和“enemy.enemylist.length==0”的情况,这会导致您的关卡完成并有机会产生更多的敌人,这显然是一种异常情况。这可能是您的错误的原因,尽管很不幸。一个快速的解决方法是插入一个“return”;在调用完成()之后。您的“levelmanage”对象也可能以某种方式从舞台上移除,并停止接收进入帧事件,这可能由单个对象引发两个“sttage.restart()”调用。在您的“进程”函数中随时检查此条件是否为真,并检查与此行为的相关性。并通过一切手段消除这种情况的可能发生。

于 2012-09-02T17:12:17.520 回答
0
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 事件本身的问题。

于 2012-09-03T08:37:19.643 回答