我正在使用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");
}
}
提前致谢!
答案 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.TIMER
或TimerEvent.TIMER
。您应该在Main
中拥有您的事件处理程序
并在那里循环你的对象并要求他们更新。拥有多个事件监听器对性能不利,并且可能会按照您不期望的顺序调用它们,并且您最终可能会遇到无法理解的错误。