基于帧的计数器或计时器?

时间:2011-10-12 00:18:36

标签: actionscript-3

我使用这个基于帧的计数器而不是计时器类,因为我游戏中的所有内容都是基于帧的。此计数器可确保即使在旧计算机上使用也能正常运行。

我想知道创建一个基于十分之一帧的计数器(甚至是一个基于第二十二帧的计数器)是否有意义。基本上它将与下面的计数器几乎相同,除了framesPerSecond-variable除以10或20而不是使用秒我使用tenthsesonds或Twentiethseconds。

这是一个好主意还是坏主意?在旧计算机上使用时,基于帧的计数器和计时器之间基本上有区别吗? 因此,我不确定这个主题。

{
import flash.events.*;


public class BasicFrameTimer extends EventDispatcher
{
    public static const TIME_IS_UP:String = "timesup";
    public var countUp:Boolean = false;
    public var min:int = 0;
    public var max:int;
    public var maxSet:Boolean = false;
    public var seconds:int;
    private var frameCount:int;
    public var started:Boolean = false;
    private var framesPerSecond:int;

    public function BasicFrameTimer(framesPerSecond:int) {
        this.framesPerSecond = framesPerSecond;

    }

    public function start():void {
        frameCount = 0;
        started = true;
    }

    public function stop():void {
        started = false;
    }

    public function reset():void {
        if (countUp) {
            seconds = 0;
        } else {
            seconds = max;
        }
    }

    public function update():void {

        if (started) {
            frameCount++;
            if (frameCount > (framesPerSecond)) {
                frameCount = 0;

                if (countUp) {
                    seconds++;

                    if (maxSet == true && seconds == max) {
                        stop();
                        dispatchEvent(new Event(TIME_IS_UP));
                    }
                } else {
                    seconds--;
                    if (seconds == min) {
                        stop();
                        dispatchEvent(new Event(TIME_IS_UP));
                    }
                }
            }

        }


    }

}
}

2 个答案:

答案 0 :(得分:2)

Timer与使用frame event之间存在差异,这会对舞台的更新方式产生影响,而不仅仅是在旧计算机上。

您可以将建议的每秒帧数设置设置为.fla文件的一部分,并且已编译的.swf将尽力跟上建议的设置。如果不能,它会开始跳帧以跟上。

如果你已经定义了某些交互,例如动画,在帧事件上发生,或者通过帧计数器,它们将使用帧执行,这意味着更高的fps将导致更快的动画。相反,如果动画依赖于计时器,它们将与计时器一起执行。

使用计时器执行将以动画的某些不稳定为代价保留实时交互。测试您是否已为更新周期正确实现计时器的一种好方法是将fps降低到12并查看动画是否在相同的时间内完成(±1s) )。

当您标记为时,我建议您使用组合。

使用Timer的循环应该用于检查输入,加载资源和检查游戏状态(inputloadupdate

使用ENTER_FRAME的循环应该用于修改可绘制资产(render

使用EXIT_FRAME的循环应该用于卸载资源(unload);

组合的原因是您将能够在常规时间间隔内执行简单计算,但在实际需要渲染之前,您不会浪费时间使用任何特定于渲染的逻辑。此外,它还允许您的时间关键资产即使在慢速机器上也能保持同步。

答案 1 :(得分:2)

实现帧速率独立动画的最佳方法是使用getTimer()函数。它返回自Flash VM启动以来经过的毫秒数。

每帧只应执行一次屏幕更新。

使用getTimer(),您可以确定自上一帧(最后一次屏幕更新)以来经过的精确毫秒数。使用此值,您可以轻松地对显示列表进行必要的调整。

例如,使用这种技术,即使系统只能更新屏幕每500毫秒一次。