Introduction
Classe de base (#1)
Classe de base (#2)
Héritage et surcharge (#1)
Héritage et surcharge (#2)
Diffuser des événements
Classe liée
Classe de document
Classe externe : une visionneuse (#1)
Classe externe : une visionneuse (#2)
Classe externe : méthodes statiques
Les bases de la POO en AS3 (Actionscript 3), par la pratique, et à l'usage des débutants
Bonjour
Aujourd'hui on attaque les grossièretés : POO (Programmation Orientée Objet).
Là, voilà, le mot est lâché. De toutes façons depuis le temps qu'on le rencontre à chaque coin de doc, forum, tuto…, il fallait bien un jour cesser de jouer les prudes ou les langues de bois. On fait de la POO, ben voui, c'est comme ça. C'est pas notre faute aussi, c'est la faute à Flash qui nous allèche avec ses animations toutes simples à faire, et puis de fil en aiguille, de stop en play, nous voilà à mastiquer de l'Objet du matin au soir sans même bien savoir si c'est remboursé par la sécu !
Ce tuto s'adresse donc à ceux qui viennent de l'environnement auteur, toutes les malheureuses victimes de la belle convivialité de notre ami Flash, qui sans forcément avoir de grandes ambitions en développement, voudraient tout de même bien savoir de quoi on leur parle quand la doc donne, pour illustrer l'emploi d'une pauvre propriété, 50 lignes absconses sous forme de package.
Ce tuto s'adresse aussi à tous ceux qui, comme notre ami Ronchon, ont grand plaisir à utiliser les outils de dessin et d'animation mais n'ont pas l'intention d'en faire plus qu'il n'est nécessaire sans pour autant se priver d'obtenir ce qu'ils veulent.
Mon idée pour permettre à quiconque vient de l'environnement auteur (ide) de s'y retrouver dans cette jungle ésotérique de la programmation objet est de prendre les choses à contre pied : partir de la pratique (ce qu'on connait et utilise au quotidien), pour arriver à la théorie (vocabulaire et définitions).
En fait je vous propose une promenade au pays des objets, un peu le nez au vent, au hasard des opportunités et des envies. A la fin de la balade vous aurez fait connaissance avec tout le petit monde de la POO, rencontré et apprivoisé le vocabulaire qui fait peur, manipulé et expérimenté. Vous pourrez alors tirer le meilleur parti des nombreux tutos et ouvrages plus académiques dont regorge le net et tout particulièrement du livre de Thibault Imbert que j'ai consciencieusement relu pour rédiger ce qui suit.
Ah si, il vous faut bien sûr connaitre l'IDE, savoir manipuler les symboles de bibliothèque et manipuler les masques. La plus part des exemples s'appuient sur cette technique.
C'est pas ma faute !
C'est Ronchon : c'est lui qui nous a entrainé ici avec ses velléités de visionneuse.
Si vous avez besoin de vous rafraichir les idées au sujet des masques, le tuto qui en traite est ici, et c'est la deuxième partie (Masques et ActionScript) qui servira de point de départ aux premières expérimentations.
Après une introduction aux concepts de la programmation objet aussi courte que faire se peut, j'embarquerai donc ceux qui le souhaitent sur le chemin des classes buissonnières en partant des symboles de bibliothèque jusqu'à remonter à la source.
Vous êtes prêt ? Les godillots lacés, le sac à dos bouclé ? Alors, en route !
Quoi
La métaphore classique, quand on parle de classe c'est celle du moule. Fabriquer une classe c'est fabriquer un moule avec lequel on obtiendra autant d'objets semblables qu'on le souhaite.
Imaginons un moule Lapin (mon côté fille bucolique) on peut, en l'utilisant, démouler trois wagons de lapins en plâtre exactement semblables.
Le moule virtuel qu'est la classe fait la même chose, si ce n'est qu'il nous permet tout un tas de sophistications supplémentaires.
Par exemple on pourrait souhaiter obtenir des lapins de couleurs différentes. Des objets semblables avec une caractéristique commune personnalisante, ici la couleur. On pourrait aussi fabriquer des lapins intelligents, ou à défaut ('faut pas s'énerver non plus) des lapins qui savent faire des choses, courir par exemple, manger, sauter… Et puis on pourrait, suprême sophistication, obtenir des lapins qui parlent. En tous cas des lapins qui préviennent quand il leur arrive quelque chose, par exemple nos lapins pourraient crier “je suis mort” quand on les tue (pour les garçons) ou “je n'ai plus faim” quand ils ont suffisamment mangé.
Maintenant qu'on se connait (peut-être) vous savez que ce type de métaphore ne dure pas bien longtemps avec moi, aussi vais je reprendre l'exemple avec du vocabulaire plus adapté.
Ce qui caractérise les objets, l'adjectif en grammaire, c'est une propriété en langage Objet
Ce que font les objets - les verbes -, ce sont des méthodes.
Le sujet c'est l'objet lui même,
et ce que “crient” les objets ce sont des événements.
Des objets, on en manipule à longueur de temps.
L'objet clip par exemple : tous les clips sont issus de la classe MovieClip et pour les utiliser on a recours aux toujours mêmes propriétés, méthodes et événements.
Quand
Pour aller vite on peut dire qu'on fabrique une classe chaque fois qu'on a besoin de faire toujours la même chose.
Dans quel but
Fabriquer une classe c'est fabriquer un fichier .as.
Toutes les classes que nous construirons auront une structure identique mais leur contenu (ce que nous y écrirons et comment) dépendra de la destination de la classe en question ; je veux dire : de ce à quoi on la destine, du cadre dans lequel nous l'utiliserons.
On peut isoler différents cas de figure selon que nous les utiliserons en association étroite avec un fichier fla ou non.
Classes relatives à un fichier .fla
Classes destinées à être utilisées conjointement à un symbole de bibliothèque
Classe liée à un symbole de bibliothèque
Classe de base d'un symbole de bibliothèque
Ces deux cas sont assez semblables (à une petite nuance que je détaillerai le moment venu) et très fréquemment mis en œuvre. C'est un moyen de “customiser” les symboles clips ou boutons, de leur conférer des capacités qu'ils n'ont pas nativement.
Classe associée au fichier fla
Classe modèle de document
Une classe écrite dans ce cadre sera destinée à être associée à un fichier .fla pour l'enrichir de certaines fonctionnalités.
Classes génériques
Ces classes ne sont associées à rien, on les utilise “directement”.
Classe outil
Constituée principalement de méthodes une classe de ce type fait des choses… des calculs par exemple. La classe Math typiquement, est une classe qu'on utilise pour calculer des arrondis, des tangeantes et autres cosinus.
On pourrait envisager une classe perso qui se chargerait de faire pour nous des calculs tordus dont on a besoin souvent.
trace(Math.PI)
… affiche la valeur PI dans la fenêtre de sortie. On pourrait concevoir une classe perso MaClasse :
trace(MaClasse.ageDuCapitaine)
Plus sérieusement : vous travaillez pour un vigneron, et vous avez besoin tout le temps de calculer des volumes de… tonneaux…
Raaa… il faut se débrouiller de la hauteur, des petits et grand diamètres…
Une classe judicieusement pensée nous permettrait :
trace(MaClasse.volume(150,60,90))
Nous verrons ici comment faire ce type de classe.
Classe "classique"
On conçoit ce type de classe quand on rêve d'un objet qui n'existe pas. Elles se comportent, et sont utilisées exactement comme les classes que nous manipulons au quotidien :
Prenons la classe Loader, par exemple, à laquelle on a recours pour charger des fichiers. Comment s'utilise-t-elle ? D'abord on crée un objet de type Loader, puis on l'utilise pour charger une image (par exemple)
// on crée un objet de type loader var ldrFichier:Loader = new Loader(); // on fait quelques "réglages" (valoriser des propriétés…) // (je ne décris pas ce n'est pas le sujet) // on utilise l'objet pour charger, on fait appel à sa méthode load. ldrFichier.load(…); // on l'affiche addChild(ldrFichier)
On pourrait souhaiter une classe Damier qui fabriquerait des damiers. Une fois construite par nos soins il n'y aurait plus qu'à l'utiliser, tout comme on le fait avec un objet de type Loader
// on crée un objet de type Damier var unDamier:Damier= new Damier() // on fait quelques "réglages" unDamier.couleur1=0xFF00FF; unDamier.couleur2=0x00FF00; // on utilise l'objet pour fabriquer, on fait appel à sa méthode fabrique. unDamier.fabrique(6,3) // on l'affiche addChild(UnDamier)
Oh ! Le joli damier rose et vert, six lignes trois colonnes…
Ici, je suis en pure hypothèse, je me contente d'illustrer le parallèle entre classe fournie et classe perso.
Nous créerons ici une classe de ce type.
Avec une classe Lapin :
var monLapinRose:Lapin: new Lapin(0xFF00FF) var monLapinBleu:Lapin: new Lapin(0x0000FF) monLapinRose.addEventListener(Lapin.OnMeParle, qdCause) monLapinBleu.rejoindre(monLapinRose) function qdCause(e:Event){ }
…je m'égare
Comment
Puisqu'il est plus pratique pour comprendre de s'appuyer sur ce qu'on connait, je vous propose de commencer par les classes destinées à être associées à un symbole de bibliothèque. Nous en profiterons pour voir des notions fondamentales valables pour tous les types de classe.
