我使用这个基于帧的计数器而不是计时器类,因为我游戏中的所有内容都是基于帧的。此计数器可确保即使在旧计算机上使用也能正常运行。
我想知道创建一个基于十分之一帧的计数器(甚至是一个基于第二十二帧的计数器)是否有意义。基本上它将与下面的计数器几乎相同,除了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));
}
}
}
}
}
}
}
答案 0 :(得分:2)
Timer
与使用frame event
之间存在差异,这会对舞台的更新方式产生影响,而不仅仅是在旧计算机上。
您可以将建议的每秒帧数设置设置为.fla
文件的一部分,并且已编译的.swf
将尽力跟上建议的设置。如果不能,它会开始跳帧以跟上。
如果你已经定义了某些交互,例如动画,在帧事件上发生,或者通过帧计数器,它们将使用帧执行,这意味着更高的fps将导致更快的动画。相反,如果动画依赖于计时器,它们将与计时器一起执行。
使用计时器执行将以动画的某些不稳定为代价保留实时交互。测试您是否已为更新周期正确实现计时器的一种好方法是将fps降低到1
或2
并查看动画是否在相同的时间内完成(±1s) )。
当您标记为game-development时,我建议您使用组合。
使用Timer
的循环应该用于检查输入,加载资源和检查游戏状态(input
,load
,update
)
使用ENTER_FRAME
的循环应该用于修改可绘制资产(render
)
使用EXIT_FRAME
的循环应该用于卸载资源(unload
);
组合的原因是您将能够在常规时间间隔内执行简单计算,但在实际需要渲染之前,您不会浪费时间使用任何特定于渲染的逻辑。此外,它还允许您的时间关键资产即使在慢速机器上也能保持同步。
答案 1 :(得分:2)
实现帧速率独立动画的最佳方法是使用getTimer()
函数。它返回自Flash VM启动以来经过的毫秒数。
每帧只应执行一次屏幕更新。
使用getTimer()
,您可以确定自上一帧(最后一次屏幕更新)以来经过的精确毫秒数。使用此值,您可以轻松地对显示列表进行必要的调整。
例如,使用这种技术,即使系统只能更新屏幕每500毫秒一次。