使用 TimerEvent AS3 循环函数数组

Cycle array of functions with TimerEvent AS3

我正在制作一个动画片段,其中包含我希望在特定时间间隔执行的一小部分函数。

代码如下:

var Tmr:Timer = new Timer(1000, 3); 
var funcArray:Array = [move1, move2, move3];
var i:Number = 0;
funcArray[i]();

function kick(){
 if (i < 2) {i++; funcArray[i](); trace("GO NEXT");}
 else {i = 0; funcArray[i](); trace("FROM-START");}
 }

function timerX():void{ 
 Tmr.start();
 Tmr.addEventListener(TimerEvent.TIMER_COMPLETE, outro); 
 trace("TIMERSTART");
 }

function outro(e:TimerEvent):void{  
 e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
 trace("TIMEREND");
 kick();
 }

function move1(){
 item1.x = 100;
 item1.y = 100;
 trace("MOVE1");
 timerX()
 }

function move2(){
 item1.x = 300;
 item1.y = 400
 trace("MOVE2");
 timerX();
 }

function move3(){
 item1.x = 800;
 item1.y = 600
 trace("MOVE3");
 timerX();
 }

如你所见,我已经用跟踪命令填充了它,因为......黑魔法发生在 move1() 被播放之后:显然它开始每秒循环一次函数而不是 5 次,就像它取决于一个Enter_Frame 事件。

输出中的跟踪顺序为:MOVE1, TIMERSTART, TIMEREND, MOVE2, TIMERSTART, GO NEXT, TIMEREND, MOVE3, TIMERSTART, GO NEXT, TIMEREND, MOVE1, TIMERSTART, FROM-START...

而不是:MOVE1、TIMERSTART、TIMEREND、GO NEXT、MOVE2、TIMERSTART、TIMEREND、GO NEXT

我还尝试将结尾部分的 kick() 函数上移

function outro(e:TimerEvent):void{  
 kick();
 e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
 trace("TIMEREND");
 }

结果是它不会超过 move2()。

您认为错误在哪里?我以前写这个的逻辑有什么问题?

感谢您的帮助!

根据每秒触发的计时器,您已定义 Timer 每 1 秒调度一次计时器事件;虽然,在开火前重复 3 次 TIMER_COMPLETE

var Tmr:Timer = new Timer(1000, 3);

如果您希望计时器每 5 秒触发一次,您可以:

var Tmr:Timer = new Timer(5000);

接下来,您永远不会停止或重置计时器。您可以 stop()start() 计时器;或者,如果您要让计时器重复特定次数,则 reset() 计时器。

因为你似乎只是想无限地每 5 秒触发一个事件,所以真的没有必要启动/停止/重置/添加新的侦听器 - 只需启动计时器并侦听计时器事件即可:

var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

function timerHandler(event:TimerEvent):void {
    // timer fired
}

将所有这些放在一起,如果您只想从:移动 1、移动 2、移动 3 无限重复:

import flash.utils.Timer;
import flash.events.TimerEvent;

var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

var actions:Array = [move1, move2, move3];
var i:uint = 0;

function timerHandler(event:TimerEvent):void {
    actions[i]();

    if(++i >= actions.length)
        i = 0;  
}

function move1():void {
    trace("move1");
}

function move2():void {
    trace("move2");
}

function move3():void {
    trace("move3");
}

function exit():void {
    timer.reset();
    timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    timer = null;
}