Управление FPS загруженного SWF - PullRequest
1 голос
/ 20 мая 2009

Я работаю над флэш-приложением, в которое загружаю несколько SWF-файлов. Но проблема в том, что у них разные частоты кадров (25.12.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 ]

1 голос
/ 20 мая 2009

В 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, к которым вы применяете эту функцию.

0 голосов
/ 03 октября 2009

Это настоящая проблема, я искал сеть для ответа. У меня есть частицы, следующие по пути, и я хочу изменить скорость, по которой эти частицы будут следовать по пути динамически, без изменения всего фильма. только ролик частиц.

Я пробовал гринсок, но на самом деле это не работает так, как мне нужно ... я думаю, что есть что-то, что вы можете динамически изменить для каждого mc, но без кубиков.

stage.frameset только для всего фильма ... argggggggg ..... отстой ..

0 голосов
/ 20 мая 2009

Мне кажется, что наиболее вероятная причина, по которой это не сработает, заключается в том, что для каждого загружаемого клипа требуется простая, полностью не динамическая анимация, которая зацикливается навсегда. Если загруженный контент настолько прост, почему бы просто не настроить его так, чтобы он выглядел лучше при 30 кадрах в секунду? (Если он очень длинный, сценарий JSFL может автоматизировать процесс добавления дополнительных кадров.) С другой стороны, если содержимое не такое простое, то попытка изменить время, вызывая nextFrame из другого места, не собираюсь давать вам то, что вы хотите.

С учетом всего вышесказанного, если вы уверены, что это именно то, что вы хотите сделать, но вы получаете 0 в качестве возврата за currentFrame в загруженном контенте, вы уверены, что они являются AS3 SWF? Если это не так, то взаимодействие AS3 / AS2 - сложная тема, на которую стоит почитать.

0 голосов
/ 20 мая 2009

Насколько мне известно, все мувиклипы в одном экземпляре флеш-плеера (совместно использующие одну и ту же «сцену») будут работать с одинаковой скоростью - невозможно, чтобы два клипа работали на разных скоростях. Поэтому, чтобы отрегулировать скорость, вы должны прибегнуть к вызову gotoAndStop () для всех MovieClips в загруженном клипе в нужное время - это не будет забавой.

Код в соответствии с тем, что показывает quoo, будет работать только в том случае, если загруженный SWF-файл содержит только 1 мувиклип (без вложенности), насколько я вижу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...