Depuis l'abandon d'Adobe Flash par les navigateurs, certains articles sont obsolètes.
D'autre part, le discours sur la plaie IE est à relativiser. Il a évolué. Il n'empêche
qu'il a sévi des décennies ...
█ Faites votre swf !
Du Flash sans Flash
Le langage de programmation qui nous intéresse est l'actionscript 2 (as2). Bien que la version 3 existe depuis longtemps,
l'as2 n'en est pas obsolète pour autant et convient très bien pour ce que nous avons à faire.
C'est donc avec un simple éditeur de texte que l'on va construire de toute pièce un tout petit swf, le composant
Flash que tout le monde connaît. Au final, il faudra le compiler.
A regarder le code ci-dessous, on se dit que c'est plutôt simple. Ca l'est si on respecte quelques règles car les raisons d'un non
fonctionnement peuvent être nombreuses et difficiles à débusquer. Il n'y a pas forcément d'alerte. Ca marche, ou pas !
Il nous faut porter une attention à ceci :
- Le chemin des fichiers joués doit être déterminé par rapport au dossier de la page qui joue.
- Sous Linux, attention aux permissions des fichiers.
- Lorsque le swf appelle javascript, le nom de la fonction doit être déclaré en dehors du domready Mootols.
- Pour ne pas s'emmêler, Le nom de la classe (nom du fichier et nom de déclaration de classe) doit être le même que le nom du swf.
- La compilation ne crée pas le swf (à contrario de Flex avec l'as3). Il faut en récupérer un (
le mien
par exemple - clique droit, enregistrer la cible sous) que l'on renommera.
- Le problème du cache Internet Explorer a été évoqué page précédente. Il faut quelques fois mettre l'anticache
sur l'url des fichiers audio.
Voici le code qui nous intéresse :
import flash.display; import StdTypes; import std8Types; import MovieClip; import flash.external.ExternalInterface; class monswf { private static var song:Number = _root.mp3; private static var autostart:Number = _root.auto; private static var son:Array = new Array(); private static var fichier:String = ""; private static var init = prechargeMp3(); private static function prechargeMp3(){ // attention : le chemin des fichiers mp3 doit correspondre avec // l'emplacement où est joué le swf (lui-même pouvant être ailleurs) fichier = "song"+song+".mp3"; son[song] = new Sound(); son[song].loadSound(fichier, true); // true pour du streaming var fct1:Boolean = ExternalInterface.addCallback( "jouer",monswf,joueson); son[song].setVolume(100); if(autostart == 0) son[song].stop(); var fct1:Boolean = ExternalInterface.addCallback( "jouer",monswf,joueson); var fct2:Boolean = ExternalInterface.addCallback( "stopper",monswf,stopson); var str:String = song + " va être joué !"; if(autostart == 0) str =" a été arrêté !"; ExternalInterface.call("coucou", 'le son ' + str); } public static function joueson(num, pos) { son[num].start(pos); } public static function stopson(num) { son[num].stop(); } }
- Ce fichier doit être enregistré du nom de sa classe avec l'extension .as
- Au début, on récupère les 2 infos FlasVars avec _root.mp3 et _root.auto.
- Il a été dit précédemment que nous avions un parti pris : celui de lancer le son au chargement du swf.
Il n'y a donc que le fichier demandé qui est chagé. Si nous voulions utiliser la commande et la fonction
'joueson', il faudrait précharger les sons avec une boucle en leur affectant l'instruction stop() pour qu'ils ne démarrent
pas tous en même temps ;-)
- On déclare le fichier son à jouer.
- Avec _root.mp3 on récupère un numéro envoyé par FlashVars (mais on pourrait bien sûr récupérer une url complète).
- On crée l'objet Sound.
- A noter que si le deuxième argument de loadSound etait à false, il faudrait attendre que le fichier soit complètement chargé
avant qu'il ne soit joué.
- Il n'y a pas d'instruction start(), celle-ci y étant par défaut.
- Les arguments de addCallback sont le nom qu'utilise js pour appeler la fonction as2, le nom de la classe puis
le nom de la fonction as2 que js appelle.
- Comme on le voit, call communique l'info que l'on veut à js.
- Par FlashVars, on peut communiquer autant de variables que l'on veut, par exemple pour agir sur le volune (setVolume()).
- L'argument de la fonction start(arg) correspond au nombre de secondes zappées au commencement de la lecture. Utile
pour programmer une pause.
Là encore, c'est un fichier démo. A vous de l'adapter. Il reste maintenant à compiler ce fichier.
█ Compilation sous linux
- Installer le paquet mtasc.
- Se placer dans le dossier où se trouve le fichier as et le swf renommé au nom de la classe.
- Ouvrir un terminal dans ce dossier et entrer le code suivant :
/opt/mtasc/mtasc -v -cp /opt/mtasc/std8 -swf monswf.swf monswf.as
Evidemment, cela suppose que le dossier mtasc soit dans /opt.
Faire Entrée. Si tout se passe bien, une liste d'instructions apparaît en un temps record pour ne pas dire instantanément.
S'il y a une erreur de syntaxe ou de déclaration, celle-ci apparaîtra avec le n° de la ligne. C'est tout.
Le swf est maintenant utilisable. Si le dossier de développement n'est pas celui d'utilisation, copier / coller le swf à
l'endroit voulu (attention aux chemins des fichiers son dans le fichier as).
█ Compilation sous Windows
- Télécharger Mtasc ici ou
là .
- Placer le dossier dézippé à la racine de c:/ pour simplifier le chemin.
- Créer un fichier BAT dans le dossier où se trouve le fichier as et le swf renommé au nom de la classe.
Enregistrez-le sous "compil_monswf.dat" et entrez-y le code suivant :
C:\mtasc\mtasc -v -cp C:\mtasc\std8 -swf monswf.swf monswf.as -version 8
- Double-cliquez sur ce fichier. C'est compilé ! Si ça ne marche pas, faites en sorte que le fichier utilise cmd.exe pour s'ouvrir et, au besoin, copier-coller la ligne de code ci-dessus dans la fenêtre dos qui s'ouvre.
█ Mais encore ...
Il existe bien sûr d'autres manières de procéder que celle de recharger le swf pour changer de son. Entre autres, une simple fonction avec arguments, sans aucun préchargement, donnera le même résultat que précédemment. Par exemple :
public static function joueson(mp3, num, vol, pos) { son[num] = new Sound(); son[num].onLoad = function(success:Boolean) { if (success) { nomDeLaClass.son[num].start(pos); nomDeLaClass.son[num].setVolume(vol); } } son[num].loadSound(mp3, true); }
█ Vers d'autres horizons Flash ...
Une fois que l'on a compris le principe, la programmation actionscript, qui se manipule comme du javascript, peut vite devenir passionnante. Ainsi, dans le but de traduire le principe de fonctionnement d'une pedale steel guitare, j'ai concocté cette application qui se trouve sur www.josepaldir/com/psg.
Par ailleurs, pour donner des outils de maintenance de site Internet, j'ai développé (en as3) une solution de redimensionnement d'image avant upload. Car les personnels amenés à faire des mises à jour, je pense ici aux communes et secrétaires de mairie que je connais bien (j'ai fait 4 mandats de maire) ne sont pas nécessairement férus d'informatique.
Agrémenter les pages de petites vignettes nécessite
la maîtrise d'un logiciel de dessin pour les redimensionner avant upload. Ou alors, on uploadera une image de 3 ou 4 mo
pour l'afficher avec une taille de 100 x 80 pixels ! Gâchis et perte de temps.
L'outil concerné est donc une page sur un serveur, laquelle utilise un swf pour redimensionner une image sur le poste client
avant de la télécharger dans le répertoire qui va bien. Bien sûr, cela est associé avec un autre outil personnalisé
de maintenance de pages, en l'occurrence xinha, un éditeur WYSIWYG HTML.