Library-SWCs mit FDT erstellen

Es ist recht einfach, ein komplettes Projekt als SWC zu kompilieren: Rechtsklick auf’s Projekt -> Run as -> FDT SWC Library (Quelle). Ein Ant-Skript wäre schöner, aber grundsätzlich ist es so erst mal einfach. Was die Sache nämlich an anderer Stelle verkompliziert, ist der allseits beliebte Fehler 1047:

Parameter initializer unknown or is not a compile-time constant.

bzw.

Parameterinitialisierer unbekannt oder keine Kompilierungszeit-Konstante.

Dieser tritt dann auf, wenn man eine Konstante als default-Übergabe-Parameter nutzt, und die Klasse mit der Konstante erst nach dieser Klasse kompiliert wird. Oder so. Es gibt haufenweise Einträge dazu im Bug-Tracker, teilweise schon jahrealt, leider ohne Ergebnis. Die längste Antwort von Adobe (die nicht “OK, wird noch mal geprüft” lautet) ist “Wäre schwierig zu implementieren, machen wir nicht.”^^

Deshalb folgende Lösungsansätze:

  • Ein Workaround im Netz ist es, einfach keine Konstanten zu nutzen – das ist natürlich Quatsch.
  • Ein anderer ist es, die entsprechende Funktion zu ändern – statt “foo:Number=MyConstants.FOO” “foo:Number=NaN”. Man prüft dann in der Funktion auf NaN, und setzt ggf. dort erst die Konstante. Das funktioniert, aber das will man eigentlich nicht für externe Libraries (ich meine damit projektexterne Libraries, nicht das Projekt an sich, was hier ja auch eine Library werden soll^^) .
  • Dann: Unter Project Properties -> FDT Build Path -> Build Order die Reihenfolge der SWCs und Sourcefolder so zu ändern, dass die Klasse eben zuerst kompiliert wird. Geht auch nur, wenn Konstanten-Klasse und aufrufende Klasse in verschiedenen Packages liegen einen separaten Eintrag im Build-Path haben
  • Deshalb habe ich gerade ein neues Package einen neuen Ordner angelegt, zum Build-Path hinzugefügt, dort unter den korrekten Pfad die aufrufende Klasse verschoben, und dieses neue Package diesen neuen Ordner (heißt bei mir “compilerbug”) mit der oben beschriebenen Methode als erstes kompiliert 🙁 auch unschön, aber so muss ich wenigstens keine Klasse anderer Leute anfassen

Das nervt mich gerade extrem, hat jemand eine bessere Lösung?

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

Alternativen für Facebook-Posts aus Actionscript

Wer mit der Facebook-API für Actionscript Posts absetzen will, kann das direkt machen:

oder als Javascript-Overlay:

oder als Pop-Up

Das data-Object beinhaltet die in den Docs unter “Publishing” beschriebenen Parameter.

Actionscript: Einen Dialog zur Webcam-Auswahl anzeigen

Die “Auswahl” der angeschlossenen Webcam, bzw. die Erkennung, ob eine Webcam angeschlossen ist, is’ immer so ‘ne Sache. Es gibt wilde Skripte mit Schleifen über Camera.names, mit Unterscheidung des Betriebssystems, mit Prüfung auf “USB Video Class Video”. Sieht alles irgendwie nicht generisch aus.
Was ich gerade gefunden habe, klingt dagegen ganz gut:

To display the Flash Player Camera Settings panel, which lets the user choose the camera to be referenced by getCamera(), use Security.showSettings(SecurityPanel.CAMERA)

Das Ganze sieht dann aus wie oben.

Facebook Profilbild mit LoaderMax laden

Facebook-Profilbilder kommen von gefühlt 20.000 unterschiedlichen Server; vermutlich eine Load-Balancing-Sache. Und die crossdomain dieser Server ist nicht ganz so offen, wie man das auf den ersten Blick gerne hätte. Nun kann man natürlich aus der URL des Bildes (die sich ja abfragen lässt) den Server extrahieren, und die crossdomain dieses Servers laden… genau das bietet LoaderMax aber schon von haus aus:

das “true” des LoaderContextes bedeutet, dass die entsprechende crossdomain geladen wird.

robotlegs-utilities-Modular mit LoaderMax

Wer das Robotlegs Utility Modular von Joel Hooks zusammen mit LoaderMax verwendet, der sollte den LoaderContext nicht vergessen:

Danke an Björn.