具有TimerEvent.TIMER事件的Timer对象可由所有对象全局访问

时间:2012-02-16 12:42:13

标签: flash actionscript-3 adobe

我正在使用Flash制作一个非常简单的游戏。我想让所有动画框架不可知,这样我就可以在不影响游戏流程和速度的情况下改变帧速率。 我在某处读到,如果你想这样做,你只需创建一个Timer对象并将一个事件监听器附加到这个计时器。

如果我有许多对象必须听同一个计时器怎么办?请参阅代码以了解我要做的事情。在这个阶段没有什么破坏,但事件不会发生。

这是Main类,即在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;
    }


}

这是Player类,其中一个需要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 个答案:

答案 0 :(得分: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.TIMERTimerEvent.TIMER。您应该在Main中拥有您的事件处理程序 并在那里循环你的对象并要求他们更新。拥有多个事件监听器对性能不利,并且可能会按照您不期望的顺序调用它们,并且您最终可能会遇到无法理解的错误。