使用TimerEvent AS3循环函数数组

时间:2015-10-09 01:52:08

标签: arrays actionscript-3 flash timer

我正在制作一个动画片段,其中包含一系列我希望在一定时间间隔内执行的功能。

以下是代码:

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()之后发生了黑暗魔法:显然它开始循环函数EVERY SECOND而不是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 等。

我还试图在outro one中移动kick()函数

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

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

您认为错误在哪里?在我用来写这个的逻辑上出了什么问题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

根据定时器每秒触发,你已经定义Timer每1秒发送一次定时器事件;虽然在发射TIMER_COMPLETE之前重复3次。

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
}

把这一切放在一起,如果你只是想从:move1,move2,move3无限重复:

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;
}