Gibt es hier (bzw. hier); die Sourcen liegen hier. Sind auch ganz gut anzupassen, auf dass sie nicht nur mit WP funktionieren
Category Archives for Flash / AS3
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 liegeneinen separaten Eintrag im Build-Path haben - Deshalb habe ich gerade
ein neues Packageeinen neuen Ordner angelegt, zum Build-Path hinzugefügt, dort unter den korrekten Pfad die aufrufende Klasse verschoben, unddieses neue Packagediesen 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”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private var _camera : Camera; // ... _camera.addEventListener( StatusEvent.STATUS, _onCameraStatus ); // ... private function _onCameraStatus( event : StatusEvent ) : void { if( event.code == 'Camera.Muted' ) { // do stuff } } |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static function capitalize( input : String, ignoreAllButFirstLetter : Boolean = false ) : String { if( input ) { if( ignoreAllButFirstLetter ) { return input.substr( 0, 1 ).toUpperCase() + input.substr( 1, input.length ); } else { return input.substr( 0, 1 ).toUpperCase() + input.substr( 1, input.length ).toLowerCase(); } } return ''; } |
Der zweite Parameter ist hilfreich, wenn man einen String an beliebigen Trennzeichen camelCasen möchte – etwa einen Namen an Leerzeichen und Bindestrichen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public static function capitalizeWords( str : String, delimiter : Array ) : String { var capitalized : String = str; if( capitalized && capitalized.length > 0 ) { capitalized = capitalized.toLowerCase(); var d : *; var word : String; var words : Array; var tmp : String; for each( d in delimiter ) { tmp = ''; words = capitalized.split( d ); for each( word in words ) { tmp = tmp + capitalize( word, true ) + d; } // remove trailing delimiter: capitalized = tmp.substr( 0, tmp.length - 1 ); } } return capitalized; } |
Aufruf dann z.B. so:
1 |
name = capitalizeWords( name, [ ' ', '-' ] ); |
HTH
AS: Coden mit TextMate, kompilieren mit der IDE (Minimallösung)
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!):
1 2 3 4 5 6 |
package test { import flash.utils.ByteArray; [Embed(source="../script/build.number", mimeType="application/octet-stream")] public class BuildNumber extends ByteArray{} } |
Diese Klasse kann man nun instantiieren und auslesen:
1 2 |
var obj:BuildNumber = new BuildNumber(); trace( obj.toString() ); |
Eleganter: Man schreibt den Inhalt in’s Kontextmenü:
1 2 3 4 5 |
var buildNr : ContextMenuItem = new ContextMenuItem( 'Build: ' + obj.toString() ); buildNr.enabled = false; var myMenu : ContextMenu = new ContextMenu(); myMenu.customItems.push( buildNr ); contextMenu = myMenu; |
HTH
Alternativen für Facebook-Posts aus Actionscript
Wer mit der Facebook-API für Actionscript Posts absetzen will, kann das direkt machen:
1 |
Facebook.api( '/me/feed', _publishPostHandler, params, URLRequestMethod.POST ); |
oder als Javascript-Overlay:
1 |
Facebook.ui( 'feed', data, null, null ); |
oder als Pop-Up
1 |
Facebook.ui( 'feed', data, null, 'popup' ); |
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()
, useSecurity.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:
1 |
_loader = new ImageLoader( url, { context:new LoaderContext(true, ApplicationDomain.currentDomain) } ); |
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:
1 |
new SWFLoader( url, { auditSize:false, context: new LoaderContext(false, ApplicationDomain.currentDomain) } ) |
Danke an Björn.