控制加载的swf的FPS

时间:2009-05-20 11:12:19

标签: actionscript-3 flash

我正在开发一个支持多个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);
        }

4 个答案:

答案 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)

这是一个真正的麻烦,我一直在网上寻找答案。我有跟踪路径的粒子,我想动态地改变这些粒子跟随路径的速度,而不改变整个电影。只是粒子影片剪辑。

我已经尝试过greensock,但是,这并不像我需要的那样真正起作用...我认为你可以为每个mc动态改变一些东西,但是,没有骰子。

stage.frameset仅适用于整个电影...... argggggggg .....很糟糕..

答案 2 :(得分:0)

在我看来,最不可能的原因是它需要你加载的每个剪辑都是一个简单的,完全非动态的动画,它永远循环。如果加载的内容如此简单,为什么不调整它以使其在30fps时看起来更好? (如果它非常长,JSFL脚本可以自动添加额外的帧。)或者,如果内容不是那么简单,那么尝试通过调用nextFrame来改变其时间来自其他地方不会给你你想要的东西。

尽管如此,如果你确定这是你想要做的,但你在加载的内容中得到0作为currentFrame的回报,你确定它们是AS3 SWF吗?如果不是这样,AS3 / AS2互操作是一个毛茸茸的主题,可以保证阅读。

答案 3 :(得分:0)

据我所知,一个flash播放器实例中的所有MovieClip(共享相同的'stage')将以相同的速度运行 - 没有办法让两个剪辑以不同的速度运行。因此,要调整速度,您必须在正确的时间在加载的剪辑中的所有MovieClip上调用gotoAndStop() - 这将不会很有趣。

如果加载的swf只包含1个MovieClip(没有嵌套),那么沿着quoo显示的行的代码将起作用。