AS3 帧率变化问题
Posted
技术标签:
【中文标题】AS3 帧率变化问题【英文标题】:AS3 framerate change issue 【发布时间】:2013-01-30 23:08:07 【问题描述】:我有一个切换布尔值的 KeyboardEvent,如果为真,则 FR var 将 -2/帧降至 10 的底部,如果为假,则将 +2/帧上升至 60 的顶部。它上下工作正常,但无论何时我添加“stage.frameRate = FR;”到 ENTER_FRAME 函数并播放它,它会冻结对窗口的控制。动画仍在播放,但我无法将其关闭,除非通过 Ctrl-Alt-Del。
1.为什么会这样?
2.是否可以每帧改变frameRate?
3.如果是,如何?
【问题讨论】:
时间轴上有动画吗? 【参考方案1】:嗯,我不确定即时播放帧速率是否是一件好事。你想做什么?或许还有更好的办法……
这完全是猜测,但也许当您将帧速率设置为舞台时,它会在后台初始化“某些东西”。然后,由于您在每一帧都发生这种情况,它会尝试在每一帧上进行初始化,导致它被锁定。
更新答案以包含使用 Timer 对象的示例:
import flash.utils.Timer;
import flash.events.TimerEvent;
// the timer takes in milliseconds, so for 30 frames/second, you would have a frame tick at every 1000 / 30, or 33.333ms
var tickSpeed:int = 1000 / 30;
var frameTick:Timer = new Timer(tickSpeed, 0);
function enterFrameListener(inputEvent:Timer):void
// this method will run on every timer tick
frameTick.addEventListener(TimerEvent.TIMER, enterFrameListener);
// can change the tick speed of the timer like so (setting it to 1000 means 1 frame tick every second)
frameTick.delay = 1000;
// according to the api doc however, a tickspeed of less then 20ms is not recommended
// 20ms would be equal to 60 fps
通过将其卸载到计时器,您不需要弄乱整体帧速率,其他对象的另一个优点可以同时受到不同计时器的影响。 Timer 类本身也有一些有用的方法:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html
【讨论】:
我想到了慢动作。一种方法是获取阶段中的所有代码并一一更改值。另一种方法是将所有值基于将一次全部更改的变量。但如果我需要平稳过渡,仍然需要大量添加代码。改变 frameRate 对我来说似乎是一个好方法:设置一个更高的速率,60,并将 6 倍的差异设置为足够高的速率,以获得看似流畅的动画。这样我就可以让所有“世界”减速或加速,并且只需要调整可控符号速度。有任何想法吗? ^_^' 现在它非常简单,只是我更改并显示在文本字段中的值。我确保降低 PC 速度不会“超过 9000”。首先我让它工作,然后我在上面添加了 1 行。这使它冻结但不是移动物体的动画。它们似乎仍然以 60 fps 的速度运行。我在网上看到一个例子,当你按下按钮改变 frameRate 时,动画改变了它的速度。他们也使用了 1 行... Button press -> frameRate += 1 嗯,你所有的动画都是基于 frame/ENTER_FRAME 事件的吗?如果是这样,也许您可以将其更改为在计时器上触发并控制其速度。我将更新我的答案以包含一个示例。 +1 建议使用计时器而不是帧速率解决方案。 你这个天才!谢谢! =D 不考虑非直接帧速率一定是我很傻。嗯,今天学到了一些新东西^_^【参考方案2】:我认为您的应用卡住了,因为您尝试设置每一帧的帧速率,我建议您在 ENTER_FRAME
部分检查您的帧速率。如果您的帧速率从您想要的帧速率上升/下降,那么您应该将帧速率设置为 FR。
试试这个对你有帮助。
【讨论】:
以上是关于AS3 帧率变化问题的主要内容,如果未能解决你的问题,请参考以下文章