2013-02-15 126 views
0

我有一个KeyboardEvent开关布尔,如果是真的FR var降低-2 /帧到10的底部,如果是假的,它将+ 2 /帧升至60的顶部。它工作正常,和下来,但每当我添加“stage.frameRate = FR;”到一个ENTER_FRAME函数并播放它,它冻结了对窗口的控制。动画仍在播放,但除非通过Ctrl-Alt-Del,否则我无法关闭它。AS3帧率变化问题

1.为什么会发生这种情况?

2.是否有可能改变frameRate每一帧?

3.如果是,如何?

+0

你有时间轴上的动画吗? – abnvp 2013-02-15 13:42:46

回答

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 

通过将其卸载到一个计时器,你不应该需要更动整体帧率与其他另一个优点对象可能会同时受到不同定时器的影响。定时器类也有一些有用的方法本身以及:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html

+0

我想过慢动作。一种方法是取得舞台上的所有代码并逐个更改值。另一个是将所有值都基于一次会改变的变量。但是如果我需要平滑过渡,它仍然会对代码产生巨大的影响。而改变frameRate对我来说似乎是一个很好的方式:设置更高的比率,60,并使6倍的差异达到足够高的速度,以获得看似平滑的动画效果。这样我就可以让所有的“世界”变慢或超速,并且只需要调整可控制的符号速度。有任何想法吗?^_ ^' – SherWood 2013-02-15 04:53:12

+0

现在非常简单,只是我改变并显示在文本字段中的一个值。我确定它不会“超过9000”来降低PC的速度。首先我做了它的工作,然后我在上面添加了1行。这使得它冻结而不是移动物体的动画。他们似乎仍然以60 fps的速度前进。我在网上看到一个例子,当你按下一个改变frameRate的按钮时,动画改变了它的速度。他们使用了1行... Button press - > frameRate + = 1 – SherWood 2013-02-15 05:04:22

+0

嗯,是基于frame/ENTER_FRAME事件的所有动画吗?如果是这样,也许你可以改变它,然后启动计时器并控制速度。我会更新我的答案,包括一个例子。 – mitim 2013-02-15 05:07:48

0

我认为你的应用程序冻结,因为你试图设置每帧的帧速率,我建议你应该检查您的帧率在您的ENTER_FRAME部分。如果您的帧速率从您期望的帧速率上升/下降,那么您应该将帧速率设置为FR。

试试这可以帮助你。