Le flash open source c'est bon

Copyright (c) 2006 ALEXIS CLAIRET

Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation :

-Une copie de cette Licence est incluse dans la section appelée  6- GNU Free Documentation License de ce document.

Sommaire :

0- Introduction
1- Installation
    1-1 Télécharger tous les outils pour pouvoir travailler
    1-2 Installation de tous ces trucs
    1-3 Configuration d'ASDT
2- HelloWorld
    2-1 Créons une bibliothèque
    2-2 Utilisons notre bibliothèque
3- Automatisation
    3-1 D'abord avec ant
    3-2 Puis avec as2ant
4- Conclusion
5- L'auteur
6- GNU Free Documentation License

   

0 Introduction

Avec ce tutorial (tutoriel ?) je vais expliquer un peu comment il est possible de faire du flash (en fait du "swf" mais par abus de langage on dit flash) sans Flash (le logiciel cette fois ci). Donc la question de base c'est :
"Mais pourquoi ???" et la réponse que je donne n'est pas de moi -je l'ai vue sur ipodlinux- mais elle est celle-ci :
"parcequ'on peut !!!". 

Si effectivement ces solutions ne permettent pas aujourd'hui d'être concurenciel dans le milieu de la communication web, elles ne sont pas pour autant inexploitables. Elles peuvent s'intégrer dans la chaîne de production et permettent d'optimiser les temps de travail. Qui dit optimisation, dit pognon !

Il n'y a pas encore si longtemps, tous les développeurs flash codaient directement dans l'ide de Flash. Puis, ils ont commencé à externaliser leurs sources -code et swf compilés-. Ils utilisaient déjà des solutions open source pour combler les lacunes de Flash (ex: Ming pour transformer des jpegs en swf). Ils ont tout de suite adopté des éditeurs externes (Scite|Flash, sepy, etc...). Aujourd'hui, tout bon développeur utilise MTASC (couplé avec un éditeur comme sepy, Eclipse, flashdevelopp) pour gagner en temps de travail. Il existe maitenant pléthore de logiciels open source qui une fois réunis pourront peut être concurencer Flash.

Pour l'instant, tout ceci n'est que de la branlette mais ca nous fait quand même bien marrer !


1 Installation

Pour commencer, ya plein de trucs chiants à faire :

1 – 1 Télécharger tous les outils pour pouvoir travailler :


à savoir :

Eclipse - http://www.eclipse.org/downloads/
MTASC - http://www.mtasc.org/#download
SwfMill - http://iterative.org/swfmill/
as2ant - https://sourceforge.net/project/showfiles.php?group_id=94206&package_id=164902&release_id=359708
ASDT – Procédure de téléchargement expliquée plus bas.

à ce jour les versions des logiciels sont les suivantes :

Eclipse 3.1.1
MTASC 1.11
SwfMill 0.2.11
as2ant 1.0 alpha
ASDT 0.0.8 build 5 (unstable version)

C'est un sacré joyeux bordel mais je vais expliquer succintement à quoi sert tout ça.

Eclipse est un environement complet de développement open source. Il a toutes les fonctionnalités de base comme tous les bons éditeurs de code (autocomplétion, des choses pour parcourir vos classes, des aides, de la doc, des templates de code etc etc...). Il existe énormément de plugins pour ce soft.

Mais malheureusement, notre ami Eclipse ne connait pas du tout l'ActionScript en natif. Mais grace à son systeme de téléchargement de plugins, on joutera la “perspective” ActionScript.

MTASC est un compilateur. C'est lui qui va nous pondre des swf entre autre.

SwfMill est compilateur aussi. Il va nous permettre de générer des bibliothèques (swf) que l'on pourra ensuite utiliser (fonts, clips, composants, images).

as2ant : est une extension d'ant logiciel écrit en java qui permet la construction de tout un projet (compilation de bibliothèques, sources ou encore d'autres tâches) au sein même d'Eclipse.

ASDT est un plugin pour Eclipse qui défini une “perspective” spéciale pour le developpement Flash.

En fait, ce plugin ajoute (ou enlève) des fonctionnalités à l'interface dès que vous travaillez sur un projet Flash (“file > new > ActionScript Projetct” par exemple).

Il comprend aussi la coloration syntaxique et l'autocomplétion (couplé avec MTASC qui vérifie la bonne syntaxe du code, ainsi qu'une aide formidable de debuggage “automatique”).

1 – 2 Installation de tous ces trucs

On va créer un répertoire “flashos” et on y “installera” tous les outils. Je mets “installer” entre guillemets car ces logiciels ne requièrent pas d'installation. Il suffit de les décompresser. A tout moment vous pouvez supprimer le dossier flashos, cela n'affectera en rien votre os. Vous ne vous retrouvez pas avec des logiciels en trop sur votre disque ou d'autres éventuels spyware etc...

La premiere chose à faire est de décompresser Eclipse, puis MTASC, puis swfMill et enfin as2ant dans ce répertoire “flashos”. Pour les utilisateurs de linux, il faut juste compiler swfMill (un petit # ./configure vous dit si vous avez toutes les bibliothèques, puis un # make , # make install comme d'hab si vous galérez à installer/compiler, rendez vous sur le site de swfMill).

J'ai renomé les repertoires par défaut pour une meilleure lisibilité :

capture 1urs par compiler le bouzin en dernier mais ça peut effectivement faire
Bon, il reste ASDT à télécharger. Pour ça il faut lancer Eclipse. Au premier lancement, Eclipse va vous demander un répertoire de travail par défaut. Je vais utiliser un classique "workgroup" dans le répertoire "flashos". Masquez ensuite le message de bienvenue, cliquez sur "help", puis "Software Updates > Find and Install...". Une pop up apparait, séléctionnez "Search for new features", une autre page se pointe. Cliquez sur "New remote Site", entrez "ASDT" dans le champ "Name" et "http://aseclipseplugin.sourceforge.net/updates" dans le champ "URL". Cliquez sur "ok" pour fermer la fenêtre. Séléctionnez "ASDT" dans la liste des remotes "Sites to include in search" puis cliquez sur "finish". Faites "next" et "install All" pour terminer l'installation.

Youpi, nous avons tout téléchargé... il faut maitenant configurer.

1-3 Configuration d'ASDT

ASDT nous offre une nouvelle "perspective", séléctionnez-la dans "Window > Open Perspective > Other..., ActionScript2". Les perspectives définissent un environement de développement en ajoutant ou retirant certaines options, fenêtres, menus etc...
ASDT nous propose donc des raccourcis spécifiques aux projets flash (clic droit dans "Navigator > New > New ActionScript2 Project" ou directement dans la barre de menu (le petit repertoire avec un "f" rouge)).
Avant de créer notre premier projet, nous allons configurer ASDT.
Ce plugin permet -lorsqu'il est couplé avec MTASC- la vérification à tout instant de la bonne syntaxe de votre code. MTASC étant beaucoup plus rapide que le compilateur de macromedia (qui a dit Adobe ?), ASDT l'utilise pour vérifier votre syntaxe à chaque sauvegarde ! Grace à cette "feature" on gagne énormément en temps de développement.
Vous devez sans doute connaître ce sentiment atroce de crackage total lors du "control + entrée" au sein de l'IDE Flash. Vous savez éperduement que vous vous êtes planté dans le nom d'une variable ou dans le nomage d'un clip mais vous vous coltinez 3 minutes de compilation de Flash en essayant de cliquer sur ce foutu bouton annuler qui ne marche jamais ! ben ça c'est fini...

Donc pour paramétrer ASDT allons dans "Window > Preferences... > ActionScript2" et commencons par définir le "Compiler", séléctionnez MTASC dans la liste déroulante et cochez "Check syntaxe on Save" et "Check syntaxe when a AS file is opened".  Dans la rubrique "MTASC" définissez le chemin vers le compilateur ("/home/fs/flashos/mtasc/mtasc" par exemple...). Il faut ensuite définir le "Core path". C'est le chemin du repertoire racine des Classes utlisées par le compilateur. Vous pouvez définir le chemin vers le repertoire "Classes" qui se trouve la où vous avez installé Flash. Si vous n'avez pas Flash, définissez le repertoire d'MTASC ("/home/fs/flashos/mtasc/"). Ce repertoire contient les Classes nécessaires (MovieClip, Button, etc..). La Rubrique "Editor" n'a pas besoin d'explications.

Bon, fermons cette fenêtre de préférences et créons un nouveau "ActionScript2 project", nomons le "HelloWorld". Lors de la création d'un nouveau projet ASDT nous crée un répertoire "src" (qui existe vraiment dans le "workspace/HelloWorld") et un repertoire virtuel "core" qui lui n'existe pas vraiment. C'est un lien vers les Classes définies dans le "Core path". Malheureusement sous linux, ce repertoire virtuel ne marche pas. ASDT n'arrive pas à resoudre le chemin. Il faut donc le supprimer.
De toute façon, vous pouvez à n'importe quel moment, créer un repertoire virtuel vers vos Classes. La vérification syntaxique d'ASDT ne marche pas sous linux, il fait une erreur et c'est plutot relou... Si l'auteur d'ASDT me lit : qu'il regarde !

 image qui montre qu'asdt merde sous linux

Bref, on peut donc à la manière du répertoire "core", définir des liens vers des répertoires de Classes de cette façon. Clic droit sur le projet, "New > Other... > Simple, folder" puis "next". Entrez un nom pour le répertoire ("package" par exemple) puis, cliquez sur "Advanced>>". Eclipse vous propose alors de créer un lien vers un répertoire de votre disque. Choisissez alors la racine de votre répertoire de Classes. Dès lors, vous avez accès depuis votre projet à vos classes "générales" (comme vous devez avoir défini ce chemin dans les paramètres actionscript de flash). Les Classes sont accessibles mais il faut définir ce nouveau chemin à ASDT (tout comme dans flash).
Donc, faites un "clic droit > preferences" sur le projet "HelloWorld", et allez à la rubrique "AS2 Class Path". Tapez "package", puis "add". Désormais, MTASC cherchera aussi dans ce répertoire les Classes lors d'une compilation.

On va vérifier qu'ASDT / MTASC fonctionnent.

Créez donc une nouvelle classe dans "src", nomez la "Main" par exemple...
Essayez donc de taper :

class Main{
    razopiuemaklzne;:,nqsàé'()ç_ ;
}

et faites un control+s. Si tout est bien configuré, la fenêtre "Problems" doit vous dire un truc du genre "Parse error unexpected razopiuemaklzne;:,nqsàé'()ç_ ;"
Si vous ne voyez pas d'erreur, vérifiez les configuration d'MTASC.

testons maintenant;

class Main{
    private var mc:MovieClip;
}

Si vous n'avez pas d'erreur, c'est très bien. Si la fenêtre "Problems" vous dit "type error class not found : MovieClip" c'est que vous avez un problème avec votre "core path".

puis si vous avez un répertoire de package, testez un import d'une de vos classe:

import com.flasheur.utils.Jambon;
class Main{
    private var jmb:Jambon;
}

Si vous avez une erreur (avec une de vos Classes hein), c'est que vous avez un soucis avec une des liaisons des "répertoires virtuels" ou que vous n'avez pas défini son chemin dans le "AS2 Class Path" du projet.

Si tout est bon, continuons...

2 - Hello World

On va quand même le faire, rien que pour l'histoire de l'informatique... c'est comme les dans les jeux vidéps type "rpg", ca commence toujours avec un héro qui se réveille.

Créons donc dans le projet "HelloWorld" une classe Hello (Hello.as) dans le répertoire "src". Et tapez ça dedans :

class Hello{
    static public var m:Hello;
    public function Hello(){
        _root.createTextField("out",0,0,150,40);
        _root.out.text = "Hello World";   
    }
    static public function main(){
        var m = new Hello();
    }
}

On peut voir dans le constructeur la création d'un TextField que l'on rempli de la chaine "Hello World".
Ce qui est important dans cette classe c'est la deuzième méthode static.
Cette méthode "main" est le point d'entrée de notre logiciel. Il faut donc au moins une méthode "main" dans un projet flash sous peine de ne rien exécuter. Dans cette fonction, on crée une instance de HelloWorld. L'instanciation exécute donc le constructeur de la classe, ce qui nous donnera donc, un champ texte. Enregistrez ce fichier.

Nous allons compiler ce fichier et en faire un swf.
Créez un repertoire "swf" à la racine de votre projet.
Il nous faut donc ouvrir un terminal et compiler la classe.

$ ./mtasc -cp ~/flashos/workgroup/HelloWorld/src -header 320:240:25 -main -swf ~/flashos/workgroup/HelloWorld/src/hello.swf Hello.as

avec windows ça ressemble à ça

c:\>mtasc.exe -cp "c:/chemin vers projet/src" -header 320:240:25 -main -out "c:/chemin vers projet/swf/hello.swf" Hello.as

Il faut penser à mettre des guillemets si les chemins contiennent des espaces.

"-cp" sert à définir un répertoire qui contient des Classes. On peut l'utiliser plusieur fois genre

$./mtasc -cp "~/un package par ci" -cp "~/un package par la" Hello.as
-header défini le "format" du swf 320x240 à 25 fps.
-main indique au compilateur de créer le "point d'entrée" du flash.
-out défini le fichier en sortie.

Attention, chez les utilisateurs de linux, ça ne marchera pas si vous n'avez pas les polices...

Logiquement avec tout ça, on est déjà capable de faire des sites etc...
Mais bon, c'est quand même pas très pratique. On va voir qu'on peut améliorer un petit peu ça. On peut notament créer une bibliothèque grace à swfMill.

2-1 Créons une bibliothèque.

Nous pouvons créer des semblants de bibliothèques avec swfMill. Les bibliothèques se définissent en XML. C'est très simple et très pratique.
Créez un répertoire "library" à la racine du projet ainsi qu'un fichier "library.xml" dans ce repertoire. A ce point du tutorial votre projet doit ressembler à ça :

le projet

Sur le site de swfMill vous trouverez toute la syntaxe afin de créer des bibliothèques "avancées". Je vais juste expliquer ici comment insérer un jpg dans la bibliothèque. Copiez donc le jpg (logo.jpg) que vous voulez insérer dans la bibliothèque dans un nouveau repertoire "images" dans "library". Et éditez le library.xml comme suit

<?xml version="1.0" encoding="iso-8859-1" ?>
<movie width="320" height="240" framerate="25">
<background color="#ffffff"/>
<frame>
<library>
<clip id="idLogo" import="../workgroup/HelloWorld/library/images/logo.jpg"/>
</library>
</frame>
</movie>

on va utliser swfMill à la main pour créer un swf.

donc, placez vous dans le repertoire "swfmill" et tapez un truc du genre :

$ ./swfmill simple ~/flashos/workgroup/HelloWorld/library/library.xml ~/flashos/workgroup/HelloWorld/swf/library.swf

Ceci vous crée un fichier "library.swf" dans le repertoire "swf".

Rien de bien sorcier dans la création du xml... un movie de 320*240, framerate 25, une couleur de fond, et sur la premiere frame, une bibliotheque avec un jpg qui a pour nom de liaison "idLogo".

On voit tout de suite que ces histoires de chemins relatifs à swfMill ou absolus sont bien chiants.
On verra un poil plus tard comment bien automatiser ces "process" avec as2Ant pour moins ce prendre la race.  Néamoins on peut désormais utilisez mtasc pour injécter du code dans ce swf tout fraîchement crée et en sortir un nouveau.

2-2 Utilisons notre bibliothèque.

Editez donc le Hello.as et ajoutez un truc du genre :


_root.attachMovie("idLogo","monLogo",1);
...après la création du champ texte par exemple.

Nous allons recompiler notre classe "Hello.as" avec MTASC mais cette fois ci, nous allons demander à MTASC d'injecter le code, non pas dans un "nouveau fichier swf" mais de prendre la bibliothèque (library.swf) comme fichier de référence. Comme ceci :

$ ./mtasc -cp ~/flashos/workgroup/HelloWorld/src -main -swf ~/flashos/workgroup/HelloWorld/swf/library.swf -out ~/flashos/workgroup/HelloWorld/swf/hello.swf Hello.as

Alors la parcontre, va savoir pourquoi, il faut virer le header des params de MTASC sinon ca marche pas.
Je crois qu'on peut le virer du library.xml et celui d'MTASC marchera.

Maitenant qu'on sait tout ça on peut donc faire des bibliothèques, en utiliser les objets liés (fonts, clips, composants, swc etc...) et publier le tout dans un beau swf. Cela dit, en ligne de commande, ça reste très chiant. On va donc voir qu'on peut optimiser le bordel graçe à as2ant.

3 - Automatisation

3 - 1 d'abord avec Ant

Ant est un projet open source de la fondation apache. Il permet l'automatisaion de la compilation d'un quelconque projet. Il a été conçu pour être facilement modifiable et pour s'étendre à tout type de langage. On donne à ant des directives de compilation dans un fichier xml (généralement "build.xml"). As2ant est une extension d'ant qui va nous permettre donc d'automatiser notre bordel de compilation à la main. Comme tout est en xml c'est super fastoche.

Créons donc un fichier "build.xml" à la racine de notre projet et éditons le. Vous trouverez toute la doc sur la syntaxe sur le site d'as2ant mais on va en voir un petit morceau qui pertmet d'automatiser ce qu'on a déjà fait.

<?xml version="1.0" encoding="utf-8"?>
<project name="Hello World Build" default="hello" basedir=".">
<target name="hello">
    <echo message="Hello World"/>
</target>
</project>

vous enregistrez et vous cliquez sur la "petit fleche verte avec la valise rouge" et hop, en fenêtre de sortie vous devez avoir untruc du genre :

Buildfile: /home/fs/flashos/workgroup/HelloWorld/build.xml
hello:
     [echo] Hello World
BUILD SUCCESSFUL
Total time: 811 milliseconds
<?xml version="1.0" encoding="utf-8"?>

alors oui, 811 milliseconds c'est beaucoup mais c'est un ordi pourri que j'ai sous la main.

bref, si ça a fait untruc comme ça, c'est que ant à marché.
On va voir que dans ce xml on peut définir plein de choses...

on peut par déjà définir une ou deux variables intéréssantes comme le chemin vers nos répertoires "src" "library" et "swf"

<property name="src.dir" location="src"/>
<property name="lib.dir" location="library"/>
<property name="swf.dir" location="swf"/>

Finalement on pourrait même se passer d'as2ant et n'utiliser qu'ant car on peut commander des executables... genre :

<?xml version="1.0" encoding="utf-8"?>
<project name="HelloWorld" default="compile">
    <target name="compile">
        <exec executable="/home/fs/flashos/mtasc/mtasc">
            <arg line="et ici tous les paramètres (-cp, -out, etc...)"/>
        </exec>
    </target>
</project>

Mais même si c'est possible, c'est pas des plus pratique. Et c'est là qu'as2ant entre en jeu !


3 - 2 puis avec as2ant

As2ant utilise MTASC et swfmill, on va définir leur chemin réspéctif.

<!--outils-->
<property name="mtasc" location="./home/fs/flashos/mtasc/mtasc"/>
<property name="swfmill" location="./home/fs/flashos/swfmill/swfmill"/>
<!--pour windows
<property name="mtasc" location="c:\flashos\mtasc\mtasc.exe"/>
<property name="swfmill" location="c:\flashos\swfmill\swfmill.exe"/>
-->

On peut maitenant définir nos deux tâches (taskdef) comme ça :

<taskdef name="mtasc_task" classname="org.as2lib.ant.Mtasc" classpath="/home/fs/flashos/as2ant/src/"/>
<taskdef name="swfmill_task" classname="org.as2lib.ant.Swfmill" classpath="/home/fs/flashos/as2ant/src/"/>

Et maitenant, on peut utiliser nos tâches et on va voir que c'est quand même plus clair que du "ant brut"

<target name="swfmilltarget" description="">i
    <echo message="Je compile la bibliothèque"/>
    <swfmill_task swfmill="${swfmill}" src="${lib.dir}/library.xml" dest="${swf.dir}/library.swf" cmd="simple"/>
</target>
<target name="mtasctarget" description="">
    <echo message="Je compile avec MTASC"/>
    <mtasc_task mtasc="${mtasc}" src="${src.dir}/Hello.as"  out="${swf.dir}/hello.swf" swf="${swf.dir}/library.swf" classpath="${src.dir}" main="yes"/>
</target>

Il faut aussi penser à modifier le chemin de notre image dans "library.xml". Les chemins sont désormais relatifs à l'attribut basedir du xml. Par défaut il est égal à "." (la racine du projet) et c'est plutot pas mal. Dans library.xml passez donc le chemin de l'image à "library/images/logo.jpg". C'est quand même plus simple et plus portable.

Depuis Eclipse vous avez accès dans le panneau "outline" aux "targets" définis. Vous pouvez donc choisir de recréer le library.swf ou de compiler votre Classe Hello.as. On peut biensûr définir une target qui fait les deux.
A la fin, le xml ressemble à ça:

<project name="Hello World" default="combotarget" basedir=".">
    <property name="src.dir" location="src"/>
    <property name="lib.dir" location="library"/>
    <property name="swf.dir" location="swf"/>
   
    <!--outils-->
    <property name="mtasc" location="/home/fs/flashos/mtasc/mtasc"/>
    <property name="swfmill" location="/home/fs/flashos/swfmill/swfmill"/>

    <taskdef name="mtasc_task" classname="org.as2lib.ant.Mtasc" classpath="/home/fs/flashos/as2ant/src/"/>
    <taskdef name="swfmill_task" classname="org.as2lib.ant.Swfmill" classpath="/home/fs/flashos/as2ant/src/"/>

    <target name="swfmilltarget" description="">
        <echo message="Je compile la bibliothèque"/>
        <swfmill_task swfmill="${swfmill}" src="${lib.dir}/library.xml" dest="${swf.dir}/library.swf" cmd="simple"/>
    </target>
   
    <target name="mtasctarget" description="">
        <echo message="Je compile avec MTASC"/>
        <mtasc_task mtasc="${mtasc}" src="${src.dir}/Hello.as"  out="${swf.dir}/hello.swf" swf="${swf.dir}/library.swf" classpath="${src.dir}" main="yes"/>
    </target>
   
    <target name="combotarget" description="">
        <swfmill_task swfmill="${swfmill}" src="${lib.dir}/library.xml" dest="${swf.dir}/library.swf" cmd="simple"/>       
        <mtasc_task mtasc="${mtasc}" src="${src.dir}/Hello.as"  out="${swf.dir}/hello.swf" swf="${swf.dir}/library.swf" classpath="${src.dir}" main="yes"/>
    </target>
</project>

Il suffit de séparer par ":" les chemins dans le param "classpath" pour en ajouter plusieur:

classpath="${src.dir}:/home/fs/classes:/home/fs/jambon"i

Un truc intéressant, si vous êtes sous windows c'est de lancer le flashplayer juste derrière :

<exec executable="c:\...SAFlashPlayer.exe" spawn="true">
    <arg value="${swf.dir}/hello.swf"/>
<exec>

4 - Conclusion

Voilà pour l'idée. Il y a biensûr énormément de paramètres, options, etc... j'ai fait au plus simple pour ne pas trop perdre de gens en route dans ce tutoriel.

5 - L'auteur

Alexis Clairet aka Franck Sinatra
site : www.flasheur.com
email : flashos [arobase] flasheur [point] com

6 - GNU Free Documentation License

license ici : http://www.flasheur.com/gnu/license.txt