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事件本身的问题。