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);
都会停止
我也没有任何错误,我仍然可以通过键移动我的对象
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();
}
}
}
答案 0 :(得分:1)
你有可能最终击中“levelprocess == 100”和“enemy.enemylist.length == 0”状态,这会导致你的等级完成并有机会产生更多的敌人,这显然是一种异常情况。虽然运气不好,但这可能是导致错误的原因。快速解决这个问题就是插入“返回”;在调用finish()之后。也有可能你的“levelmanage”对象以某种方式被从阶段中删除,并停止接收输入帧事件,这可能由一个对象抛出两个“sttage.restart()”调用触发。在“过程”功能中随时检查此条件是否为真,并检查与此行为的相关性。并且无论如何都要消除这种情况的可能发生。
答案 1 :(得分: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事件本身存在问题。