我正在开发一个支持多个swf的Flash应用程序。但问题是他们有不同的帧率(12/25/30)。如果我添加2个swf,它们都以25fps的速度播放。我发现了很多关于这个的话题,但我无法让它发挥作用(在AS3中)。有谁知道为什么它不起作用以及如何使其工作?
public class MainClass extends MovieClip
{
var loader:Loader = new Loader();
var request:URLRequest;
var mcMedia:MovieClip = new MovieClip();
MovieClip.prototype.setFrameRate = function(frameRate:Number)
{
var mc:MovieClip = this;
if (mc.tweenFaster != null)
{
Timer(mc.tweenFaster).stop();
}
mc.tweenFaster = new Timer(1000/frameRate);
mc.tweenFaster.addEventListener(TimerEvent.TIMER, timelineFaster);
mc.tweenFaster.start();
function timelineFaster(event:TimerEvent = null)
{
if (mc.currentFrame == mc.totalFrames)
{
mc.tweenFaster.stop();
mc.gotoAndStop(1);
}
else
{
trace(mc.currentFrame);
mc.nextFrame();
}
event.updateAfterEvent();
}
}
public function MainClass()
{
configureListeners();
request = new URLRequest("data/7/7.swf");
try
{
loader.load(request);
}
catch (error:Error)
{
trace("Unable to load requested document.");
}
}
private function configureListeners():void
{
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}
private function completeHandler(event:Event):void
{
loader.content.scaleX = 550/event.target.width;
loader.content.scaleY = 400/event.target.height;
mcMedia.addChild(loader);
mcMedia.setFrameRate(12);
addChild(mcMedia);
}
答案 0 :(得分:1)
在as3中,如果您只想更改帧率,请使用stage.frameRate = 12;或者其他什么;
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/Stage.html#frameRate
在AS3中,当你可以使用原型时,你通常不会。我重写了你的setFrameRate函数(命名错误,不应该更多..tweenFaster,或matchFrameRate还是什么?)
我会做一个像这样的辅助函数:
package util{
//imports
public class TweenFasterMC extends MovieClip{
public var mc:MovieClip;
public function matchFrameRate(frameRate:Number):void
{
if (tweenFaster != null)
{
Timer(mc.tweenFaster).stop();
}
tweenFaster = new Timer(1000/frameRate);
tweenFaster.addEventListener(TimerEvent.TIMER, timelineFaster);
tweenFaster.start();
}
function timelineFaster(event:TimerEvent = null):void
{
if (currentFrame == totalFrames)
{
tweenFaster.stop();
gotoAndStop(1);
}
else
{
trace(currentFrame);
nextFrame();
}
event.updateAfterEvent();
}
}
另外,清理你的事件监听器,如果你有很多mc应用这个功能,那么强大的计时器事件监听器会引起很多问题。
答案 1 :(得分:0)
据我所知,一个flash播放器实例中的所有MovieClip(共享相同的'stage')将以相同的速度运行 - 没有办法让两个剪辑以不同的速度运行。因此,要调整速度,您必须在正确的时间在加载的剪辑中的所有MovieClip上调用gotoAndStop() - 这将不会很有趣。
如果加载的swf只包含1个MovieClip(没有嵌套),那么沿着quoo显示的行的代码将起作用。
答案 2 :(得分:0)
在我看来,最不可能的原因是它需要你加载的每个剪辑都是一个简单的,完全非动态的动画,它永远循环。如果加载的内容如此简单,为什么不调整它以使其在30fps时看起来更好? (如果它非常长,JSFL脚本可以自动添加额外的帧。)或者,如果内容不是那么简单,那么尝试通过调用nextFrame
来改变其时间来自其他地方不会给你你想要的东西。
尽管如此,如果你确定这是你想要做的,但你在加载的内容中得到0作为currentFrame
的回报,你确定它们是AS3 SWF吗?如果不是这样,AS3 / AS2互操作是一个毛茸茸的主题,可以保证阅读。
答案 3 :(得分:0)
这是一个真正的麻烦,我一直在网上寻找答案。我有跟踪路径的粒子,我想动态地改变这些粒子跟随路径的速度,而不改变整个电影。只是粒子影片剪辑。
我已经尝试过greensock,但是,这并不像我需要的那样真正起作用...我认为你可以为每个mc动态改变一些东西,但是,没有骰子。
stage.frameset仅适用于整个电影...... argggggggg .....很糟糕..