在每次调用时都会创建一个新计时器的函数中,这是处理它的正确方法吗?
private var _timers:Vector.<Timer> = new Vector.<Timer>;
private var _timer:Timer
private function timer():void
{
_timer = new Timer(10000, 1);
_timers.push(_timer);
_timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimer, false,0,true);
_timer.start();
}
private function onTimer(e:TimerEvent):void
{
e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
_timers[0] = null;
_timers.shift();
}
答案 0 :(得分:1)
也许你可以添加一个
_timers[0].stop();
答案 1 :(得分:1)
我已经设置了处理延迟调用的“延迟”功能。我为我的游戏做了很多,我已经使用了很多延迟调用,我必须找到一种有效处理延迟的方法。仍然AS3大师在那里仍然可以找到更有效的方法,请知道是否有任何。
public static var timer_stack:Vector.<Timer> = new Vector.<Timer>();
public static function delay(delaytime:Number, func_name:Function, repeat:Number = 1)
{
var timer:Timer = new Timer(delaytime, repeat);
timer_stack.push(timer);
timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER, func_name ,false,0,true);
timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER_COMPLETE,
function(e:TimerEvent){ delay_complete(e, func_name); });
timer_stack[timer_stack.length-1].start();
}
public static function delay_complete(e, func_name:Functio):void
{
e.target.stop();
e.target.removeEventListener(TimerEvent.TIMER, func_name);
timer_stack[timer_stack.length-1].removeEventListener(TimerEvent.TIMER_COMPLETE,
function(){ func_name_complete(e, func_name);} );
for(var i=0; i < timer_stack.length; i++)
{
if(timer_stack[i].running == true)
trace("timer @ "+i+" is running");
if(timer_stack[i].running == false)
{
timer_stack[i] = null;
timer_stack.splice(i,1);
trace("remove timer @ "+i);
}
}
}
答案 2 :(得分:1)
万一您的时间因任何原因而发生变化,最好直接处理对象,而不是假设Timer
对象位于0
索引。
onTimer()
只需要进行一些小调整:
private function onTimer(e:TimerEvent):void
{
var timer:Timer = e.currentTarget as Timer;
timer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
_timers.splice(_timers.indexOf(timer), 1);
}
您不需要将索引设置为null
,并且假设您的商品将位于指定的索引,这绝不是一个好习惯,请务必确保。在这种情况下,请确保使用indexOf()
类型对象(_ timers)中提供的Array
方法。
希望它有所帮助。