Regulierung der Geschwindigkeit von swf-Filmen

Da es in Flash kein spezielles Kommando gibt, welches die Framerate eines laufenden Films verändern kann, muss dies anders bewirkt werden. Dafür ruft man eine Funktion auf, mit der sich steuern lässt, wieviel Zeit zwischen 2 Aufrufen ein und der selben Funktion vergeht (setInterval). Darüber kann man wiederum entscheiden, wie oft eine Funktion in einer Sekunde aufgerufen wird.

Zunächst fügt man zusätzlich zu den anderen jpegs die Bilder für die Buttons ein, die die Geschwindigkeit steuern sollen.

        .jpeg faster "plus.jpg" quality=100%
        .jpeg slower "minus.jpg" quality=100%
        .jpeg normal_fps "null.jpg" quality=100%

Die Funktion, die nun in einem bestimmten Intervall aufgerufen werden soll, ist die Funktion viewport1.nextframe();, mit der man ein Bild weitergeht. In einem Action-Block definiert man nun mit .var eine Variable 'framerate' und eine Funktion 'Playmovie#()' für jeden eingefügten Film. Außerdem ist es notwendig, für jeden Film eine Variable 'intervalID' zu definieren, auf der gespeichert wird, ob die Funtion setInterval aktiv ist oder nicht.

        .action:

            var intervalID1=0;  
            var intervalID2=0;
            var framerate=5;


         
            function PlayMovie1(){
            if(viewport1._currentframe==viewport1._totalframes)
               viewport1.gotoAndStop(1);
             viewport1.nextframe();
             updateAfterEvent();}

            function PlayMovie2(){
            if(viewport2._currentframe==viewport2._totalframes)
               viewport2.gotoAndStop(1);
             viewport2.nextframe();
             updateAfterEvent();}

        .end

Hier wird framerate=5 gesetzt, da dies die default-Geschwindigkeit sein soll. Die Funktionen haben den Vorteil, dass sie im Gegensatz zur Funktion nextframe() nach dem letzten Bild wieder an den Anfang springen. Das Kommando updateAfterEvent() ist optional, es dient der besseren Aktualisierung des Bildes.

Nun folgt die Definition des Buttons "slower":

        .button slower
              .show slower as=idle,area,hover,pressed scale=100%
              .on_release inside:{
                if(framerate>1)
                      framerate=framerate-1;
                clearInterval( intervalID1 );
                clearInterval( intervalID2 );

                if(intervalID1 != 0){
                intervalID1 = setInterval( PlayMovie1, 1000/framerate );}

                if(intervalID2 != 0){ 
                intervalID2 = setInterval( PlayMovie2, 1000/framerate );}}
               .end
        .end

Solange die Framerate größer ist als 1, soll sie beim Drücken des Buttons "slower" um 1 verringert werden. Anschließend wird mit clearInterval( intervalID ) die Funktion setInterval deaktiviert. Dies ist notwendig, damit die Funktion beim nächsten Aufruf mit setInterval nicht doppelt so schnell abläuft. Mit der Abfrage if(intervalID != 0) erreicht man, dass der Film nicht mit einer veränderten Framerate losläuft, wenn er gestoppt ist (das ist auch der Grund, warum später mit Drücken des Stop-Buttons "intervalID" auf 0 gesetzt wird). Um nun die Funktion Playmovie#() mit der gewünschten framerate laufen zu lassen, wird sie alle (1000/framerate) Sekunden aufgerufen. Bei der default-framerate wäre dies alle 1000/5 = 200 Sekunden.

Der folgende Button stellt die Geschwindigket wieder auf default (framerate=5).

        .button framerate_5
                .show normal_fps as=idle,area,hover,pressed scale=100% 
                .on_release inside:{
                        framerate=5;
                        clearInterval( intervalID1 );
                        clearInterval( intervalID2 );

                if(intervalID1 != 0)
                intervalID1 = setInterval( PlayMovie1, 1000/framerate );

                if(intervalID2 != 0)
                intervalID2 = setInterval( PlayMovie2, 1000/framerate );}
                .end
        .end

Nun folgt die Definition des Buttons "faster":

        .button faster
               .show faster as=idle,area,hover,pressed scale=100% 
               .on_release inside:{
                if(framerate<10){
                        framerate=framerate+1;
                        framerate_swf.nextFrame(1);}
                clearInterval( intervalID1 );
                clearInterval( intervalID2 );


                if(intervalID1 != 0){
                intervalID1 = setInterval( PlayMovie1, 1000/framerate );}

                if(intervalID2 != 0){
                intervalID2 = setInterval( PlayMovie2, 1000/framerate );}}
               .end
        .end    

Als höchste framerate werden hier 10 Bilder pro Sekunde zugelassen.

Zum Schluss müssen auch diese Buttons noch plaziert werden.

        .put slower x=800 y=-50
        .put faster x=880 y=-50  
        .put framerate_5 x=840 y=-50

.end


Zusätzlich besteht die Möglichkeit, einen swf-Film laufen zu lassen, der immer die aktuelle framerate anzeigt. Dazu werden hier 10 Bilder mit den Zahlen von 1 bis 10 gebraucht, die zu einem swf-Film verknüpft werden (Erstellen eines swf Films). Dieser wird neben den viewports als weiteres swf eingefügt...

        .swf framerate_swf "framerate.swf" 

...und plaziert.

        .put framerate_swf x=950 y=-50 scale=100%

Anschließend wird er zu Beginn mit dem Befehl gotoAndStop() beim 5. Bild gestoppt, da diese die default-framerate sein soll.

        .action:
           framerate_swf.gotoAndStop(5);
        .end

Beim Button "slower" soll der Film nun 1 Bild zurückgehen...

        .button slower
                   .....
                        framerate_swf.prevFrame(1);
                   .....
        .end

...beim Button "framerate_5" soll der Film beim 5. Bild stoppen...

        .button framerate_5
                   .....
                        framerate_swf.gotoAndStop(5);
                   .....
        .end

...und beim Button "faster" soll der Film framerate_swf ein Bild weiter gehen.

        .button framerate_faster
                   .....
                        framerate_swf.nextFrame(1);
                   .....
        .end    


Zurück zur Synchronisation von swf-Filmen.

SWFC/Synchronisation/Framerate control (zuletzt geändert am 2007-12-23 22:49:00 durch localhost)