Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash TimerEvent.Timer事件对所有对象全局可访问的计时器对象_Flash_Actionscript 3_Adobe - Fatal编程技术网

Flash TimerEvent.Timer事件对所有对象全局可访问的计时器对象

Flash TimerEvent.Timer事件对所有对象全局可访问的计时器对象,flash,actionscript-3,adobe,Flash,Actionscript 3,Adobe,我正在用Flash开发一个非常简单的游戏。我想让所有的动画帧率不可知,这样我就可以改变帧率而不影响游戏的流量和速度。 我在某个地方读到,如果您想这样做,您只需创建一个计时器对象并将事件侦听器附加到此计时器 如果我有许多对象必须听同一个计时器怎么办?查看代码以了解我正在尝试执行的操作。在这个阶段,没有任何东西会中断,但事件不会触发 以下是主类,即在swf执行上运行的类: public class Main extends MovieClip { private static var _s

我正在用Flash开发一个非常简单的游戏。我想让所有的动画帧率不可知,这样我就可以改变帧率而不影响游戏的流量和速度。 我在某个地方读到,如果您想这样做,您只需创建一个计时器对象并将事件侦听器附加到此计时器

如果我有许多对象必须听同一个计时器怎么办?查看代码以了解我正在尝试执行的操作。在这个阶段,没有任何东西会中断,但事件不会触发

以下是主类,即在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");        

    }

}

提前谢谢

你应该启动计时器

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

计时器不会自动启动;必须调用start()方法才能启动它

还要注意的是,使用计时器并不是最好的方法。最好继续使用
事件。输入_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

然后在你的对象上循环并要求它们更新。拥有多个事件侦听器对性能没有好处,它们可能会以您不期望的顺序被调用,并且您可能会遇到无法理解的错误。

Hehe。。。对的这是我经常犯的经典错误之一。:)另外,请参阅我的最新答案。如果可能的话,试着改变你的方法。谢谢-我错过了start()部分:)我还将事件侦听器移到了我的主类。把它放在那里会更有意义,因为我以前就因为它而有记忆问题。谢谢