0_start
Vous pouvez utiliser le language Haxe pour builder des SWF Flash 9. Pour faire ceci, il suffit d'utiliser "-swf-version 9" et le compilateur Haxe génerera un SWF compatible avec Flash Player 9.
Example - Test.hx:
class Test { static function main() { // créez un TextField var tf = new flash.text.TextField(); tf.text = "Hello World !"; // ajouter le à la display list flash.Lib.current.addChild(tf); } }
Compilez en utilisant le fichier XHTML suivant - compile.hxml :
-main Test -swf-version 9 -swf test.swf
Quand vous compilez un projet pour Flash 9, vous devez utiliser la nouvelle API ActionScript3/Flash9 au lieu de celle du vieux ActionScript2/Flash8. Vous pouvez trouver sa description dans la page "Haxe API" (cliquez sur "Flash9" pour dérouler le menu). Cette API est exactement la même que celle disponible sur AS3 et elle contient d'autres méthodes non-documentées.
Cette API est documentée dans les livedocs d'Adobe
Bien qu'il puisse subsister encore quelques bogues, le générateur Haxe de code Flash9 fonctionne correctement et, dans certains cas, génère un code encore plus rapide que le compilateur officiel Flex. Essayez-le vous-même et reportez ceux que vous aurez trouvé dans la mailing list de Haxe.
Vous pouvez ajouter des informations pour déboguer votre swf Flash9 en compilant avec "-debug". Il vous permettra de voir les noms des fichiers sources Haxe et les numéros de lignes quand des erreurs d'exécutions apparaissent.
Utiliser la bibliothèque
Si vous avez des ressources graphiques créées par l'IDE Flash (MX 2004 ou CS3) ou SwfMill, vous pouvez les utiliser avec votre code Flash9 en procédant comme suit :
- avec Flash MX / SwfMill : utilisez un identifiant (le nom du lien) pour votre ressource, comme vous le feriez normalement pour un "attachMovie".
- avec Flash CS3 : utilisez un nom de class AS3 comme vous le faites normalement pour AS3
- liez statiquement votre bibliothèque dans votre sortie SWF en utilisant
-swf-lib
Attaché par des noms(?)
Haxe va automatiquement créer une class Flash9 pour que MovieClips est un nom de liaison, si celui-ci n'est pas déjà disponible. Vous pouvez directement utiliser flash.attach("myname") qui va créer une instance de ce movieClip. Pare exemple :
class Test { static function main() { var s = flash.Lib.attach("Shape"); flash.Lib.current.addChild(s); } }
Cela suppose que vous avez un clip avec soit un lien ou alors un nom de class "Shape".
Dans où votre image est un identifiant de lien mais que la class ne soit pas définie, vous pouvez récupérer l'exception lancé par "flash.Lib.attach" ou en utilisant le Flash9 Debug Player.
Class contraignantes
Si d'un autre côté vous voulez redéfinir/étendre le comportement du MovieClip, alors vous pouvez simplement définir une class dans Haxe avec le même nom :
// Test.hx class Shape extends flash.display.MovieClip { public function move() { x += 2; y += 2; } } class Test { static function main() { var s = new Shape(); flash.Lib.current.addChild(s); s.move(); } }
Compilez-le en utilisant ce fichier HXML :
-main Test -swf-lib lib.swf -swf-version 9 -swf test.swf
Il créera un SWF qui, une fois ouvert, affichera le graphique nommé "Shape" et le déplacera un peu. Dans le cas où votre graphique est un identifiant de lien mais pas une class définie, the Flash Debug Player 9 devrait vous rendre une erreur quand il sera chargé.
Incorporer une police
Si vous voulez incorporer une police, créez un fichier resource.xml comme ceci:
<?xml version="1.0" encoding="iso-8859-1" ?>
<movie version="9">
<background color="#555555"/>
<frame>
<library>
<font name="Symbols" import="font/dejavusans.ttf"
glyphs="★☆☓☠✓✔✕✖✗✘❤"/>
</library>
</frame>
</movie>
Utilisez swfmill simple resource.xml resource.swf pour builder ressource.swf avec la police. Ajoutez le code suivant quelque part:
class Symbols extends flash.text.Font {}
Ensuite, utilisez "-swf-lib resource.swf" pour linker resource.swf dans le .swf final, et utilisez votre police en utilisant le nom "Symbols". Veuillez à mettre "embedFonts = true".
Note supplémentaire:
Pour glyphs vous pouvez utiliser les lettres : 'abcdefghijklmnopkrstuvwxyz' (j'en ai oublié aucune ? ^^) mais depuis xml certains caractères ne peuvent pas être écrit de cette façon, voici donc une méthode utile pour aider à encore les caractères, il existe certainement une méthode plus optimale mais celui-ci fonctionne correctement.
private function buildAscii( s_:String ):String { var ascii: String = ''; var i: Int = 0; while( i < s_.length ) { ascii += '&#' + s_.charCodeAt( i ) + ';'; i++; } return ascii; }
Incompatibilités
Certaines fonctions ne parviendront pas à être compilées ou lancées dans Flash9 :
- avoir un bloc "try/catch" dans à l'intérieur d'une expression, tel que l'exemple suivant :
var x = try f() catch( e : Dynamic ) null; - avoir une class "implementing" d'une autre class (accepté dans Haxe mais pas dans Flash9)
- il n'y a pas d'équivalent des class Flash Error dans Haxe, vous pouvez jeter n'importe quel objet dont vous n'avez pas besoin d'hériter de l'erreur. C'est une bonne pratique en AS3 de jeter les objets de class héritées d'une class Error mais ce n'est pas obligatoire.
- il y a quelques problèmes avec nullness de Int, UInt, Float et Bool (voir dessous)
Tout le reste doit fonctionner parfaitement et fournir le même résultat sur toutes les plateformes supportées.
Nullness des types basiques
Dans Flash9, les types basiques Int, Float et Bool ne peuvent pas être assignés ou comparés avec la valeur "null". La valeur de Int par défaut est "0", de Float "NaN" et de Boll "false".
Si vous voulez être en mesure de stocker des valeurs "null" dans ces types basiques, veuillez plutôt utilisez les types "Null<Int>", "Null<Float>" et "Null<Bool>". Ceci étant la même chose que pour les types basiques, si ce n'est que lors de l'exécution un type "Dynamic" ("Object" en AS3) sera utilisé, permettant à la valeur "null" d'être stockée.
Pour les arguments optionnels, le type "Null<...>" est automatiquement utilisé.
Utilisez "Null" au lieu des types basiques dégradera un peu les performances, mais il n'y a aucune raison de s'inquiéter à moins qu'il soit utilisé pour de rapides méthodes critiques (dans ce cas n'utilisez pas les arguments optionnels ou les types "Null").
Ceci peu également avoir plusieurs effets indésirables. Par exemple la méthode suivante va retourner "null" quand on l'appelle avec des arguments.
function foo( ?x : Int ) : Null<Int> { return x; }
Alors que le suivant retournera "0" quand "null" est converti en "Int"(?) :
function foo( ?x : Int ) : Int { return x; }
Le même problème peut se produire avec des Array :
var a = new Array<Int>(); trace(a[999]); // 0 , since it's Int default value var b = new Array<Null<Int>>(); trace(b[999]); // null : it works this time
En conclusion, tandis que les types basiques sont vraiment rapide, il faut faire attention quand vous les utilisez.
Attacher des stage events
Quand votre main est créé vous pouvez attacher des stage event en appelant votre fonction init après avoir ajouter l'application au stage.
import flash.display.Sprite; import flash.events.KeyboardEvent; class Application extends Sprite { public static function main() { var app : Application = new Application(); flash.Lib.current.addChild(app); app.init(); } function init() { stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress); } function onKeyPress(e : KeyboardEvent) { trace("Key Code: " + e.keyCode); } }
Compilez-le avec la commande suivante :
haxe -main Application -swf9 movie.swf
Une autre façon de le faire est d'utiliser l'évènement ADDED_TO_STAGE.