2012-02-16 153 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