Streamen von SWFs

Grundsätzlich können SWFs streamen. Viele Preloader basieren darauf: Auf dem ersten Frame (der bereits verfügbar ist) dreht sich die Sanduhr, während der zweite Frame mit der Anwendung noch geladen wird.

So kann man zB mit LoaderMax ein SWF streamen, in dem ein Video und ein Sound auf der Zeitleiste liegen:

Leider kann man das Laden nicht pausieren:

It’s actually impossible to do a true pause/resume on a single loader in Flash. When you pause() an individual loader, it basically cancels it and then when you resume(), it starts over. You might be wondering why have pause/resume then at all, right? It’s primarily useful in a LoaderMax queue. Imagine you have 20 loaders in a LoaderMax queue and after 12 of them, you pause() while the 13th one is loading. It would technically just cancel that 13th one, but when you resume(), the 12 that had already loaded are still there – it resumes the queue at 13 and picks up from there.

Quelle

Trotzdem nice: Streaming, und trotzdem Zugriff auf einzelne Frames.

Wichtig dabei:

  • autoPlay:false. Das verhindert, dass das SWF “im Hintergrund” schon startet, während man es eigentlich noch buffert
  • die Zeilen mit “SoundTransform”. “autoPlay:false” setzt das Volume des SWF auf 0, damit man es im Hintergrund nicht hört. Das wird zwar automatisch wieder auf 1 gesetzt, aber erst, wenn das SWF fertig geladen ist!
  • Der Sound muss auf der Hauptzeitleiste liegen! Wird er in einen MC verschachtelt, muss dieser parallel zu _loadedSWF.gotoAndPlay(1) ebenfalls auf Frame 1 zurückgesetzt werden

Fonts auslagern. [UPDATE]

Es macht Sinn, verwendete Schriftarten in eine Flashanwendung einzubinden – so sind sie unabhängig vom Zielsystem verfügbar, und nicht zuletzt kann man erst dann (Alpha-)Tweens auf sie anwenden. Andererseits machen sie die Flashanwendung zum Teil sehr groß. Die Lösung? Die Schriftarten erstmal in eine separate SWF auslagern:

Zu beachten: Die Klasse muss Sprite extenden; der FontName sollte ein anderer sein als der Fontname im System (um diesen nicht zu überdecken); Schriftschnitte wie bold oder italic müssen explizit eingebunden werden. Der Übersichtlichkeit halber benenne ich die Fonts (FontName) genauso wie die Klasse, in die sie embedded werden (hier: “Foo”)

Diese Klasse wird nun kompiliert, und die SWF unter einem Pfad, zB “fonts.swf” abgelegt. Unter diesem Pfad kann sie nun, etwa im Rahmen einer Preloader-Queue mit weiteren Assets, dynamisch von der eigentlichen SWF nachgeladen werden:

Zu beachten hierbei: Es muss der komplette Package-Pfad (“x.y.z.Fonts”) an ApplicationDomain.getDefinition() übergeben werden! Nur der Klassenname genügt nicht.

Außerdem: Wann immer man den Text des entsprechenden TextField (neu) gesetzt hat, muss das TextFormat mit dem eingebundenen Font (neu) zugewiesen werden. Die Property embedFonts setzt man auf true:

hth.