2015-10-09 25 views
1

我正在製作一個動畫片段,該動畫片段包含一些我希望以特定間隔執行的函數。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後的黑暗魔法發生(我和trace命令填充它)已經玩過:顯然它啓動每次循環的功能SECOND而不是5,就像它取決於一個Enter_Frame事件。

在輸出信號線序列是:MOVE1,TIMERSTART,TIMEREND,MOVE2,TIMERSTART,去旁邊,TIMEREND,MOVE3,TIMERSTART,去旁邊,TIMEREND,MOVE1,TIMERSTART從開始...

代替的:MOVE1,TIMERSTART,TIMEREND,GO NEXT,MOVE2,TIMERSTART,TIMEREND,去旁邊

我也試圖移動踢()在結尾功能了一個

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

而且效果是它沒有去過move2()。

你認爲哪裏是錯誤?我用來寫下這個邏輯的錯誤是什麼?

感謝您的親切幫助!

回答

1

每定時器觸發每秒,您已定義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 
} 

把所有這些組合起來,如果你只是想從去: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; 
} 
+0

賈森感謝您的回覆。其實我真的錯過了'stop()'和'reset()';我寫的代碼實際上可以讓我指定不同的計時器長度,所以我可以有一定的靈活性(比如我希望在move2()和move3()之間有10秒的時間)。 我添加了它,一切按預期工作,但感謝指向另一個方向。 我想'exit()'是用來結束循環和「走出去」的東西,對嗎? 感謝您的幫助! – SimeoneSergio