AS3: GreenSock Loader (speziell XMLLoader)

GreenSock bietet primär natürlich Tweening-Krams. Aber auch die Loader sind nicht schlecht – wenn man damit zurecht kommt, dass sie mehr als nur Laden können. Der VideoLoader bsplw. ist quasi auch ein Video-Player.

Ähnlich der XMLLoader: Der lädt erst mal eine XML, aber darüber hinaus parst er diese XML und erzeugt & startet alle darin in der entsprechenden Syntax definierten Loader. Per default! Dazu zwei Anmerkungen:

  • das Flag, um dieses Verhalten zu deaktivieren, lautet integrateProgress
  • in der XML definierte Loader werden nur dann erzeugt, wenn ihre Klasse bekannt ist. Um eine Klasse bekannt zu machen (zu “aktivieren”), gibt es bsplw. LoaderMax.activate()

In Kombination führt dies zu echt mies zu findenden Bugs: “Normalerweise” kenne ich an der Stelle, an der die XML geladen wird, nur den XMLLoader – denn der lädt die XML. Das heißt, in der XML definierte XMLLoader werden immer erzeugt und ausgeführt, denn integrateProgress ist per default true. Alle anderen in der XML definierten Loader werden zwar theoretisch ebenfalls erzeugt, aber nur, wenn ihre Klassen bekannt sind (sie “aktiviert” wurden)! Fügt man in einen jahrealten (sic!) Prozess einen XMLLoader in eine XML ein, dann wird der (und nur der) plötzlich ausgelöst… unschön.

HTH.

AS3: Lesbarer “link-report”

Mit dem mxmlc lassen sich “Link-Reports” erstellen; entfernt vergleichbar mit dem “Größenbericht” aus der Flash-IDE: Welche Klassen sind in meiner SWF enthalten, und wie viel Platz belegen sie. Die Compileroption dazu (in Ant-Schreibweise aus FDT):

Allerdings sind diese Linkreports schlecht lesbar. Ich möchte auf einen Blick sehen, welche Klasse der Grund dafür ist, dass mein SWF 2 MB statt 500 KB groß ist. Gut, dass es Theo Hultberg gibt: Der hat eine XSL geschrieben, um den Linkreport in eine verständliche Form zu bringen (hier der Blogeintrag und die lokale Kopie der XSL). Ant kann XSL von haus aus:

Das Ergebnis kann sich sehen lassen: Nach Größe sortiert und mit Verlinkung auf die Klasse/SWC

linkreport

AS3: Eingebettete XML

Wer Fehler a la

identifier vor xmltagstartend erforderlich.

oder anderen kryptischen Kram bekommt, sollte die XML so einbinden:

Also: mimeType beachten, und dass die eingebettete Klasse nicht direkt auf XML gecastet wird. Außerdem ignoreWhiteSpace, das’ ja klar 🙂

AIR Native Extensions mit FDT

AIR Native Extensions (ANE) erlauben das Verwenden von System-spezifischen Funktionen – hier das Gyroscope. Mit FDT 4.5 verwendet man sie wie folgt:

  1. Die .ane-Datei kopieren, und die Kopie in .swc umbenennen.
  2. Die .swc wie gewohnt in den Classpath einbinden.
  3. In den Projekteigenschaften -> “FDT Build Path” -> “Build Order” die SWC auswählen, und einen Haken bei “Use as Runtime Shared Code” setzen.
  4. Die Extension im Description-XML deklarieren: Entgegen der Vorlage der Powerflasher heißt der Knoten nicht <extension>, sondern <extensions>, und sieht für dieses Beispiel wie folgt aus:
    <extensions><extensionID>com.adobe.gyroscope</extensionID></extensions>
  5. Die .ane-Datei im Projekt ablegen, beispielsweise unter /bin/ane/
  6. Im Build-XML (das mit dem ADT-Compiler) folgende Zeilen hinzufügen:
    <arg value=”-extdir” />
    <arg value=”../bin/ane” />
  7. Kompilieren 🙂

Tipp, Quelle 1, Quelle 2 (PDF)

Flash auf dem iPhone: Eine AIR-Videoplayer-App in FDT 4.5

Neulich stand ein entsprechendes Projekt auf dem Plan. Meine erste iPhone-App, und meine erste umfangreichere AIR-Anwendung. Hier meine Anmerkungen zum Workflow:

Zum Aufsetzen des Projektes in FDT 4.5:

Zu AIR auf dem iPhone:

  • Evt. muss der Compiler-Parameter -swf-version=11 gesetzt sein. Ohne hatte ich einen 1014 Class not found (Quelle). Damit das übernommen wird, muss ggf. USE_PROJECT_COMPILER_ARGUMENTS auf false stehen
  • Für mehr Performance: AIR 3 verwenden (Danke, Björn!); wobei ich die playerglobal.swc direkt unter www.adobe.com/support/flashplayer/downloads.html gefunden habe
  • Einen Splashscreen (“Default.png”) fügt man im jeweiligen Ant-Script unter “Files to Package” unter der SWF ein: <arg value=”Default.png” />
    (Damit erklärt sich von selbst, wo man weitere ADT-Parameter hinzufügt). Bei mir liegt das Default.png parallel zur SWF in /bin/
  • In dem Zusammenhang: Wenn ich die App-Icons in /bin/icons/* liegen habe, dann füge ich die relativ zu /bin/ im Build-Skript (<arg value=”icons/icon512.png” />) und im Descriptorfile (<image512x512>icons/icon512.png</image512x512>) hinzu
  • Um die App bei Rückkehr zum Homescreen zu beenden, muss man in der ADL-Decriptor-XML unter iPhone.InfoAdditions “<key>UIApplicationExitsOnSuspend</key><true/>” hinzufügen (Quelle)
  • Wer das iPhone 3 und 4 verwenden will, muss unbedingt die unterschiedlichen Auflösungen im Auge behalten! Ich habe es nicht geschafft, einfach die höher aufgelöste SWF auf den kleineren Screen runterzuskalieren, sondern musste im Code darauf reagieren.

Zu Video (hier: StageVideo) auf dem iPhone:

  • Ein gutes Tutorial (inkl. Sourcen) von Thibault Imbert für StageVideo gibt es hier.
  • Für StageVideo-Wiedergabe muss der renderMode (siehe Descriptor-XML) auf “gpu” oder “direct” stehen – “auto” genügt nicht. “gpu” verringert aber die Performance der restlichen Anwendung; “direct” scheint OK zu sein. (PS: “direct” wird im XML-Kommentar nicht erwähnt; Quelle)

Fazit und offene Fragen:

  • Die Performance ist schlechter als nativ, aber absolut OK. Man muss ein wenig darauf achten, wie viel man parallel macht, aber wenn man das weiß, ist AIR eine echte Alternative.
  • Wenn ich sage “die Performance ist OK”, dann meine ich Code, der (abgesehen von StageVideo) nicht optimiert ist! Die Performance ist sicherlich noch besser, wenn man z.B. Stage3D verwendet
  • Sweet: Bis zum Verpacken in einer IPA hat man ein SWF, was Abstimmungen extrem einfach macht.
  • Ich habe es nicht geschafft, das StageVideo um 90° zu drehen, was laut verschiedener Quellen möglich ist. Wer einen Tipp hat, immer her damit!
  • Die gleiche Anwendung müsste auch auf Android exportierbar sein, das habe ich aber noch nicht ausprobiert

HTH,

Lennart

AS3: Webcam-Zugriff verweigern

Wer im Auswahl-Dialog den Zugriff auf die Webcam verweigert, bekommt ein StatusEvent mit dem Code “Camera.muted”:

Konstanten dafür habe ich übrigens nicht gefunden, da bin ich für jeden Hinweis dankbar.

Achtung: Ist der Zugriff einmal abgewiesen worden, wird der Dialog nicht erneut angezeigt! Das muss man sich also selber merken, damit man im zweiten Versuch kein Camera-Objekt ohne Bild hat 🙂

AS3: CamelCase an beliebigen Trennzeichen

Tag,

wer ein einzelnes Wort camelCasen möchte, kann dies zum Beispiel so tun:

Der zweite Parameter ist hilfreich, wenn man einen String an beliebigen Trennzeichen camelCasen möchte – etwa einen Namen an Leerzeichen und Bindestrichen:

Aufruf dann z.B. so:

HTH

Actionscript: Automatisch erzeugte Versionsnummer im Kontextmenü

Für ein Projekt wollte ich irgendeine Möglichkeit haben, einer SWF ihre genaue Versionsnummer “anzusehen”. Dies sollte unbedingt automatisiert geschehen. Ich glaube mich dunkel zu erinnern, dass man mit Ant auch direkt in die AS-Klassen schreiben kann, finde das aber gerade nicht wieder… was ich aber gefunden habe basiert ebenfalls auf Ant, genauer gesagt: Auf dem “BuildNumber”-Task.

Damit liest man eine Nummer aus einer Datei (default: build.number), erhöht sie um 1, und schreibt das Ergebnis zurück. Soweit, so gut. Aber wie bekommt man das in die SWF? Mit einer Klasse, die in etwa so aussieht (ich habe es auch mit einer internal class probiert, aber nicht hinbekommen – Tipps sind willkommen!):

Diese Klasse kann man nun instantiieren und auslesen:

Eleganter: Man schreibt den Inhalt in’s Kontextmenü:

HTH