2012-02-16 2 views
0

私は非常に簡単なFlashで作業しています。私はすべてのアニメーションをフレームに依存しないものにしたいので、ゲームの流れやスピードに影響を与えずにフレームレートを変更することができます。 私はどこかで、タイマーオブジェクトを作成し、このタイマーにイベントリスナーをアタッチするだけでよいことを読んでいます。TimerEvent.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

Hehe ...正しい!これは私がいつもしている古典的な間違いの一つです。 –

+0

:)また、私の更新された回答を参照してください。可能であれば、アプローチを変更してみてください。 – sch

+0

ありがとうございます - 私はstart()の部分を見逃しました:)イベントリスナーをMainクラスに移動しました。私はそれのために前に記憶上の問題があったので、それをそこに置くのはずっと意味をなさない。ありがとう! – getack

関連する問題