Expériences


Tutoriel : Fontaine aux lucioles avec Flash

Posté dans Programmation par Enisséo le 19 août 2007

Présentation

Un peu de script et de graphisme avec un tutoriel Flash sur la réalisation d’une sorte de fontaine à lucioles multicolores ! Rien de compliqué, il faut cependant avoir quelques bases en Flash, notamment dans la création de clips, et quelques notions d’ActionScript. J’utilise personnellement la version 8 de Flash, mais je pense que l’animation est réalisable avec des versions antérieures.

Voici le résultat auquel nous allons parvenir :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

Nous allons pour cela créer tout d’abord un clip animé qui représente un “éclat”, puis nous allonssimuler une source d’éclats sur l’écran.

Création du clip de base

Création de l’éclat

Commençons par créer un document Flash de 400 pixels par 400 pixels par exemple. Pour y voir plus clair, spécifions un arrière-plan noir.

Sur ce fond noir, nous allons créer un cercle blanc d’une petite taille, sans bordure. Faire ce cercle en petite taille permet de s’approcher par la suite au mieux du rendu final. Ici, il fait 5 fois 5 pixels. Convertissons maintenant ce cercle en clip animé (touche F8 par défaut sous Windows), et appelons-le “point” histoire de ne pas se mélanger les pinceaux dans le futur.

Nous allons maintenant spécifier quelques filtres à ce cercle pour lui donner un aspect luisant. Un clic simple sur l’objet “point” permet de spécifier des filtres sur cet objet. Tout d’abord, appliquons un premier rayonnement blanc, assez proche du centre (flou de 4 sur les directions X et Y), et d’une intensité modérée : juste ce qu’il faut pour avoir l’impression que le point est une source de lumière. Il ne faut donc pas que la limite entre le cercle et le rayonnement soit trop visible. J’utilise une qualité de rayonnement élevée afin que celui-ci soit bien circulaire (avec une qualité inférieure il a tendance à avoir une forme carrée). N’hésitez pas à zoomer (400%) pour ajuster au mieux la configuration de ce filtre.

Pour donner l’impression que la source a une couleur, nous allons créer un deuxième rayonnement. Il doit sembler “décorer” l’environnement, il faut donc lui donner une plus grande ampleur : un flou sur une distance de 15 en X et Y est correct. Ici, j’ai choisi un bleu, couleur qui a tendance a moins frapper nos yeux, surtout sur du noir. J’ai donc dû spécifier une intensité assez élevée : 650% pour l’exemple. Qualité élevée, pour les mêmes raisons que précédemment.

Sortons de la modification de l’objet “point”. Nous avons crée la base de notre éclat, nous allons maintenant l’animer.

Animation de l’éclat

Nous allons transformer l’objet “point” et ses filtres en un clip animé. De la même façon que tout à l’heure, F8 permet de convertir l’objet “point” en symbole. Appelons celui-ci “eclat”. Dès la création, on peut cocher dans les options avancées “Exporter pour ActionScript”. L’objet de type “eclat” sera alors accessible dans les scripts que nous écrirons.

Ajoutons maintenant l’animation à cet éclat. Pour cela, modifions l’objet “en place” en double-cliquant dessus et insérons une image-clef à l’image 20 (touche F6). Déplaçons l’objet “point” de cette image sur un côté (à droite par exemple), en appuyant sur la touche MAJ pour garder la même ordonnée (y). Ici, j’ai activé l’affichage en pelure d’oignons pour donner une idée de la distance de déplacement : à gauche de l’image on distingue l’objet tel qu’il est positionné sur l’image 1, à droite l’objet déplacé de l’image 20.

L’étape suivante est bien évidemment la création d’une interpolation de mouvement entre l’image 1 et l’image 20. Mettons une accélération importante (ici 70) afin de donner un effet de jaillissement à cet éclat.

Nous allons maintenant faire disparaître l’éclat qui a jailli. J’ai activé ici les contours en pelures d’oignon pour voir l’ensemble de l’animation en contour. Comme l’interpolation est accélérée, vers l’image 15 les déplacements de l’objet “point” se font très courts. C’est donc à partir de là que nous allons faire disparaître l’éclat. À l’image 15, insérons une image-clef (touche F6) afin de découper l’animation en 2 : le jaillissement puis la disparition.

Sélectionnons à nouveau l’image 20 et l’objet “point” à cette image. Nous allons appliquer un flou assez large (distance de 10 en X et Y), de qualité élevée. Il va permettre de faire disparaître l’éclat par un effet proche de l’évaporation. Notez que ce filtre va apparaître automatiquement sur tous les objets “point” de l’animation “eclat” (en l’occurrence les images 1 et 15), mais que ses propriétés le rendent inactif.

Pour compléter notre disparition, appliquons un filtre de transparence complète à notre objet “point”. Dans les propriétés de l’objet, il suffit de sélectionner comme couleur “Alpha” et de la spécifier à 0%.

L’animation est terminée : vous pouvez déplacer le curseur pour constater que Flash s’est occupé de tout. Il reste cependant à indiquer au clip de s’arrêter à la dernière image pour ne pas boucler indéfiniment. Toujours à l’image 20, dans les “Actions”, écrivons stop();. Cela évitera au clip de recommencer à l’image 1 après l’image 20.

Vous pouvez à ce stade tester l’animation : l’éclat jaillit une fois et disparaît. Nous pouvons désormais passer au code ActionScript.

Écriture du script

Revenons à la scène principale. Supprimons l’objet “eclat” que nous venons de créer de la première image de la scène, tout en le laissant dans la bibliothèque. Nous allons l’insérer par script.

Nous écrirons le script à l’image 1 de la scène. Nous voulons donc que différents éclats jaillissent d’un point de l’écran, éclats ayant des tailles et des orientations différentes. Tout d’abord, créons la source des éclats, arbitrairement au point (200, 200) de l’écran :

// Création de la source des éclats
var src:MovieClip = _root.createEmptyMovieClip("src", _root.getNextHighestDepth());
src._x = 200;
src._y = 200;

Pour nommer les éclats que nous créerons, nous aurons besoin d’un compteur. Les classes ActionScript sont, pour la plupart tout du moins, spécifiées “dynamiques” (dynamic class). Cela signifie qu’on peut dynamiquement ajouter des propriétés. Profitons-en pour ajouter le compteur en tant que propriété de la source :

// Compteur d'éclats
src.i = 1;

La scène affiche par défaut 12 images par seconde (modifiable dans les propriétés). Il s’agit plus ou moins de la fréquence d’actualisation des clips. Comme on ne peut aller plus vite que la machine, nous allons créer un éclat par image. Pour cela, spécifions une fonction à appeler à chaque fois qu’une image du clip source est affichée :

// Création d'un éclat par image (12 images/sec par défaut)
src.onEnterFrame = function()
{
[CONTENU DE LA FONCTION]
};

Remplissons maintenant le contenu de la fonction. Nous voulons que la taille des éclats soit variable, que les éclats partent de la source et enfin que leur direction soit aléatoire :

	var size:Number = Math.random() * 5;	// Taille aléatoire
 
// Copie d'un clip de la bibliothèque dans un clip (ici _root)
var eclat:MovieClip = _root.attachMovie(
"eclat",							// Nom du clip à copier
"eclat" + (this.i++),				// Nom du clip créé
_root.getNextHighestDepth(), 		// Profondeur du clip
{									// Propriétés de l'objet
_x: this._x, _y: this._y,		// Sur la source
_width: size, _height: size		// Taille
}
);
 
// Important ! Spécifier _rotation dans les propriétés
// de l'objet à la création a une fâcheuse tendance à le déformer
eclat._rotation = Math.random() * 360;	// Direction de l'éclat

On a donc créé une variable size aléatoire entre 0 et 5 permettant de déterminer la largeur (_width) et hauteur (_height) de l’objet “eclat” copié. Cet objet est nommé en fonction du compteur, incrémenté au passage ("eclat" + (this.i++)). Comme nous créons les éclats dans la scène principale (_root.attachMovie), la profondeur et la position sont spécifiées selon la scène principale : _root.getNextHighestDepth() pour la profondeur, this._x et this._y pour récupérer les coordonnées de la source, elle-même positionnée dans la scène principale. Enfin, nous indiquons la rotation (_rotation) après la création pour éviter une déformation de l’objet.

C’est terminé ! Il ne reste plus qu’à essayer ! Si vous vous êtes perdu dans la rédaction du script, vous pouvez le télécharger et le copier-coller au bon endroit.

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

Pour obtenir d’autres fontaines du plus bel effet, vous pouvez utiliser dans le script un filtre travaillant sur les couleurs : ColorMatrixFilter. Je vous joins un deuxième exemple où les couleurs sont très variées et un troisième, dont les couleurs de l’éclat varient autour de sa teinte originale. Pour cela, il suffit de modifier les teintes rouge, vert et bleu du clip de façon légère : j’additionne à la teinte originale un nombre entre -16 et 16. Voici le résultat :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

Edit : les utilisateurs de Flash CS3 devront certainement enregistrer les clips en compatibilité ActionScript 2.0 et les fichiers en compatibilité Flash 8. Si vous parvenez à faire fonctionner le tutoriel en utilisant d’autres versions d’ActionScript et Flash, n’hésitez pas à m’envoyer les modifications par mail ou dans les commentaires.

Conclusion

Ce tutoriel présente une technique simple mais efficace. En modifiant le clip animé, quelques paramètres ou l’affichage il est possible de réaliser de multiples effets : fumée, feu d’artifice, traînées… Attention toutefois aux performances qui tombent rapidement si les animations dupliquées sont trop complexes, trop longues ou trop nombreuses.

Cet article peut être modifié ou approfondi ultérieurement. Il ne se veut pas complet et n’est pas exempt d’erreurs. N’hésitez pas à les signaler.

Vous pouvez m’adresser vos remarques ou suggestions à enisseo@hotmail.com. Je ne manquerai pas de vous répondre.

13 réponses to 'Tutoriel : Fontaine aux lucioles avec Flash'

Souscrire aux commentaires avec RSS ou TrackBack to 'Tutoriel : Fontaine aux lucioles avec Flash'.

  1. Enisséo said,

    le 13 septembre 2007 à 11:55

    À noter que je ne parle pas de gestion de la mémoire dans ce tutoriel, ce qui fait que les animations produites feront ramer l’ordinateur. Un petit article rapide sur la destruction des objets en mémoire viendra peut-être compléter ce tutoriel un jour. Les animations présentes dans le tutoriel ont été tout de même compilées avec du code de gestion mémoire.

  2. maximedt said,

    le 16 janvier 2008 à 17:48

    Moi j’ai plein d’erreurs
    L’instruction doit apparaître dans le gestionnaire on/onClipEvent
    onEnterFrame = function()

    Peux tu m’aider ?

  3. georges said,

    le 27 février 2008 à 16:44

    moi je n’ai aucune erreur, mais rien ne s’affiche…(on ne voit pas les éclats de lumières, un problème au niveau du attachMovie? j’utilise la CS3 avec AS2)
    et j’ai refait le tuto 4 fois… =/

  4. Enisséo said,

    le 27 février 2008 à 23:40

    georges, peux-tu tester si, dans la première image du premier calque, la ligne suivante affiche bien l’animation de la lueur au centre de la scène :
    _root.attachMovie(”eclat”, “eclat”, _root.getNextHighestDepth(), {_x: 200, _y: 200});

    Si ce n’est pas le cas, en ne supposant aucune faute de frappe, il s’agit peut-être d’une modification dûe au passage en AS3 d’une fonction ou d’un comportement par défaut : propriété _visibility à false au départ, clip chargé en mode “stoppé” (donc un appel à play()), utilisation différente des niveaux (getNextHighestDepth())… À voir sur les forums et sites officiels du coup.

  5. Baron said,

    le 1 juin 2008 à 15:58

    Salut!!
    mon animation fonctionne apparemment bien, mais le hic est que:
    1.Mon clip reste à la position x:200 et y:200;
    2.Les clips dupliqués conservent toujours le même taille de leur apparition à leur disparition.

    Merci pour les conseils

  6. Enisséo said,

    le 1 juin 2008 à 20:14

    Quelle version d’ActionScript utilises-tu ? As-tu essayé en recopiant directement le code fourni dans le lien ? Es-tu sûr d’avoir bien nommé ton clip “eclat” et que ce même clip a le bon comportement ?

  7. Bloody said,

    le 2 juin 2008 à 23:25

    Salut,
    Moi je voudrai savoir comment arréter l’effet comme dans tes exemples:
    Click to Play - l’animation ce lance.
    Click to Stop - l’animation s’arrête.

    Je suis un peut largué ^ ^”…
    Sinon le reste marche très bien, j’adore votre tuto ;).

  8. Enisséo said,

    le 2 juin 2008 à 23:29

    Plusieurs solutions :
    1. Détruire l’objet source (delete src;) et le reconstruire à chaque fois
    2. Plus propre, ajouter une variable qui autorise la création de nouveaux clips :
    src.onEnterFrame = function()
    {
    if (plusDeLucioles) {
    [CONTENU DE LA FONCTION]
    }
    };

  9. Namour said,

    le 16 juin 2008 à 0:44

    Bonjour!
    Tout d’abord bravo au référenceur pour avoir créé un tutoriel aussi bien expliqué.
    Ensuite, j’aurais aimé poser 2 questions:
    1. Où et comment intégrer le code d’Enisséo pour lancer et stopper l’animation.
    2. Et surtout, comment ajouter un préloader avant la fontaine?
    Ça me relance toujours le préloader en même temps…ca alterne 1seconde la fontaine, 1 seconde le préloader… et ça rame à mort!

    Merci d’avance.

  10. Enisséo said,

    le 16 juin 2008 à 18:24

    Le “pseudo-code” que j’ai donné plus haut devrait être inséré au même endroit que le gros bloc de code qui permet de créer l’objet source et les clips des lucioles, c’est-à-dire à la première image de la scène principale.

    En ce qui concerne le “preloader”, s’il s’agit de fournir une barre de progression pour charger juste la fontaine je pense qu’un preloader est inutile puisque l’animation doit avoir une taille très petite. Mais sinon, en cherchant sur internet il y a plein de tutoriels expliquant comment créer des préloaders, ce qui est complètement indépendant de l’animation de la fontaine : il faut d’abord créer l’animation de la fontaine, puis ensuite créer une autre animation qui insère celle de la fontaine en utilisant des outils permettant de suivre le déroulement du chargement (la classe MovieClipLoader est un bon point d’entrée pour google, me semble-t-il).

  11. LOD said,

    le 20 juin 2008 à 17:20

    Bonjour,
    Merci pour ce tutoriel très sympa. Je rencontre un problème concernant la gestion de la mémoire. Comme tu le précises les animations produites font ramer l’ordinateur (le navigateur se bloque). C’est dommage car je vais devoir renoncer à cet effet. Aurais-tu un conseil ou un code à insérer pour résoudre ce bug?

    Merci beaucoup !
    LOD

  12. Enisséo said,

    le 20 juin 2008 à 18:05

    En fait, de manière très simple, il me semble qu’il suffit de rajouter sur la dernière image de l’animation de la luciole (20), là où est écrit “stop();”, le code “delete this;”.

  13. lod said,

    le 20 juin 2008 à 22:53

    Merci pour le conseil.
    C’est vrai que ce code est très léger mais ça pompe pas mal sur l’ordi (ça continue de ramer). Finalement je vais créer une bonne vieille boucle de plusieurs clips et renoncer à cette programmation aléatoire.
    En tout cas merci encore pour ce petit tuto, je continuerai à bossr sur la question.
    salut !
    LOD

Laisser une réponse