Объект Timer с событием TimerEvent.TIMER, глобально доступным для всех объектов - PullRequest
0 голосов
/ 16 февраля 2012

Я работаю над очень простой игрой во 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, один из объектов, который будет нуждаться в таймере:

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 Ответ

1 голос
/ 16 февраля 2012

Вы должны запустить таймер.

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

Класс Timer Документация говорит:

Таймер не запускается автоматически;Вы должны вызвать метод 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 и циклически обрабатывать там свои объекты и просить их обновить.Наличие нескольких прослушивателей событий не очень хорошо для производительности, и они могут вызываться в порядке, который вы не ожидаете, и вы можете получить ошибки, которые вы не можете понять.

...