2012-02-16 150 views
0

我正在開發一個非常簡單的Flash遊戲。我想讓所有動畫幀速率不可知,以便我可以改變幀速率而不影響遊戲的流程和速度。 我在某處讀過,如果你想這樣做,你只需創建一個Timer對象並將一個事件監聽器附加到這個計時器。TimerEvent.TIMER事件的Timer對象可以全局訪問所有對象

如果我有很多需要聽同一個定時器的對象會怎麼樣?查看代碼以瞭解我正在嘗試執行的操作。在這個階段沒有什麼能夠打破,但是這個事件並沒有發生。

這裏是主類,即對SWF執行運行一個:

public class Main extends MovieClip { 

    private static var _stage:Stage; 
    private static var _timer:Timer; 

    public function Main() {    
     trace("STARTING_GAME");   
     init(); 
    } 

    private function init(){ 
     var player:Player = new Player(100); 
     this.addChild(player); 

     _stage = this.stage 
     _timer = new Timer(30); 

    } 

    public static function get stage():Stage{ 
     return _stage; 
    } 

    public static function get timer():Timer{ 
     return _timer; 
    } 


} 

這裏是球員類,那也將需要定時器的對象之一:

public class Player extends MovieClip { 

    private var playerHealth:int;  


    public function Player(_health:int=100) {   
     init(_health); 
    }  
    private function init(_health:int){ 
     trace("creating player object");    
     playerHealth = _health; 
     addEventListeners(); 


     trace(Main.timer); //this returns [object timer] - so it's supposed to work? 

    } 

    private function addEventListeners(){   

     Main.timer.addEventListener(TimerEvent.TIMER, ef_Repaint); 
     //this.addEventListener(Event.ENTER_FRAME, ef_Repaint);   

    } 

    private function ef_Repaint(e:Event):void{ 

     trace("timer event firing");   

    } 

} 

提前致謝!

回答

1

您應該啓動計時器。

private function addEventListeners(){   
    Main.timer.addEventListener(TimerEvent.TIMER, ef_Repaint); 
    Main.timer.Start(); 
} 

Timer類documentation說:

計時器不會自動啓動;你必須調用start()方法來啓動它。

另請注意,使用計時器並不是最好的方法。這是更好地繼續使用Event.ENTER_FRAME,只有執行的代碼,如果你想延遲已經過去了:

private function ef_Repaint(e:Event):void{ // Event.ENTER_FRAME 

    var timeNow = getTimer(); 
    if (timeNow - previousTime > 30) { // you can replace 30 with any delay you want 
     previousTime = timeNow; 
     // your code here 
    } 
} 

最後,如果您使用的辦法,你不應該真正聽取TimerEvent.TIMER或每TimerEvent.TIMER對象分開。你應該在Main 有你的事件處理程序,並在那裏循環你的對象,並要求他們更新。擁有多個事件監聽器對性能不利,並且他們可能會按照您不期望的順序調用,並且最終會出現您無法理解的錯誤。

+0

嘿嘿......正確!這是我經常犯的經典錯誤之一。 – 2012-02-16 13:01:49

+0

:)另外,請參閱我更新的答案。如果可能的話,嘗試改變你的方法。 – sch 2012-02-16 13:11:38

+0

謝謝 - 我錯過了開始()部分:)我也將事件監聽器移到了我的Main類。把它放在那裏會更有意義,因爲之前我有過內存問題。謝謝! – getack 2012-02-16 16:05:09