ActionScript 3 Programmation séquentielle et orientée objet


ActionScript 3 Programmation séquentielle et orientée objet

 

D a v i d T a r d i v e a u ActionScript 3 Programmation séquentielle et orientée objet © Groupe Eyrolles, 2008 ISBN : 978-2-212-12282-4 2 La gestion des occurrences sur la scène Afin d?optimiser votre code pour gérer les occurrences affichées sur la scène, il est important de comprendre le rôle et le fonctionnement de la liste d?affichage (displayList). Nous consacrons donc un chapitre à ce système de gestion. Nous présenterons ensuite la méthode addChild(), dont le but est de placer une instance de type objet d?affichage ou conteneur d?objets d?affichage sur la scène. La liste d?affichage (displayList) d?une animation Le fait de référencer tous les objets d?affichage et les conteneurs d?objets d?affichage présents dans une animation est la notion la plus élémentaire de l?ActionScript 3. Dans les versions précédentes, nous devions indiquer le chemin d?une occurrence pour pouvoir l?utiliser. La hiérarchie qui existait entre les occurrences d?une animation découlait de l?emploi d?une succession d?imbrications d?instances de type MovieClip. Une arborescence était tout de même constituée virtuellement dans la mémoire de l?ordi- nateur pour déterminer les parents et les enfants éventuels d?un objet d?affichage ou d?un conteneur d?objets d?affichage. Avec l?arrivée de l?AS3, la gestion des occurrences affichées sur la scène est donc diffé- rente, plus souple et plus logique. Ne plus devoir cibler une instance, en précisant son chemin avec une syntaxe pointée, peut éventuellement troubler les anciens développeurs Flash. Cela dit, le développement consacré à la méthode addChild() à la fin de ce chapitre vous démontre la simplicité d?accès à une occurrence, même si elle se trouve imbriquée dans un ou plusieurs conteneurs d?objets d?affichage. Tardiveau.Livre Page 35 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 36 Par ailleurs, nous ne sommes plus limités à des clips et des boutons : il existe à présent plusieurs types d?objets regroupés en classes. Chaque fois que vous placez une occurrence sur la scène, manuellement (par glisser- déposer) ou dynamiquement (en AS, avec la méthode addChild() ou un moyen équiva- lent), vous alimentez une liste d?affichage, appelée également displayList. Celle-ci permet une gestion globale des occurrences de la scène. Il est ainsi possible de détermi- ner, par des instructions en ActionScript, le nombre d?imbrications d?occurrences (occur- rences qui possèdent elles-mêmes d?autres occurrences), ce qui n?était pas le cas dans les anciennes versions de Flash. Il est maintenant important de comprendre que vous pouvez disposer de deux types d?instan- ces sur la scène : les occurrences qui peuvent en contenir d?autres (représentées par des rectangles gris sur la figure 2-1) et les occurrences qui ne peuvent contenir rien d?autre que la représentation graphique qui les symbolise (les rectangles blancs de la même figure). En d?autres termes, on distingue les occurrences qui peuvent posséder des enfants de celles qui ne le peuvent pas. La liste d?affichage des instances contenues sur la scène de Flash constitue donc une hiérarchie qui peut être gérée sous la forme de n?uds XML avec une racine (la scène d?une animation) et des n?uds enfants (les objets d?affichage ou les conteneurs d?objets Remarque Si ce dernier point vous paraît trop abstrait, ajoutons que chaque type d?objet possède son propre vocabu- laire, c?est-à-dire un ensemble de mots réservés associé aux instances qu?il générera. Pour celles et ceux qui travaillaient avec Flash 8 et les versions antérieures, les symboles de type Bouton et ceux de type Clip constituent un bon exemple : ce sont deux objets de types différents. Figure 2-1 Sur la scène de Flash, vous devez distinguer deux types d?occurrences. Celles qui ne contiennent pas d?autres occurrences et celles qui en contiennent. Tardiveau.Livre Page 36 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 37 d?affichage). Cela s?avère très pratique pour cibler une occurrence précise de la scène. La scène de Flash est alors le premier conteneur de la liste d?affichage. Quelle différence doit-on faire entre les objets d?affichage et les conteneurs d?objets d?affichage ? Celles et ceux qui ont utilisé les anciennes versions de Flash, se souviennent que les occur- rences de type clip pouvaient en contenir d?autres (de même type ou de type différent). De ce fait, en ActionScript, il était possible de faire référence à une occurrence imbriquée dans une autre. En revanche, une occurrence de type graphique ne pouvait pas être contrôlée par ce biais ; il ne servait donc à rien d?y placer des occurrences de clips nommées. Nous pourrions ainsi comparer les conteneurs d?objets d?affichage à des occurrences de type MovieClip et les objets d?affichage à des occurrences de symbole de type Graphique, à une différence près : un objet d?affichage ne peut pas contenir d?autres instances (quel que soit son type). Plus généralement, un conteneur d?objets d?affichage est une occurrence (ou une instance) qui peut en contenir d?autres, alors qu?un objet d?affichage ne le peut pas. Dès que vous placez un symbole sur la scène ou créez une instance en ActionScript et l?ajoutez avec la méthode addChild() (ou un moyen équivalent), vous créez un objet d?affichage ou un conteneur d?objets d?affichage. Vous augmentez par la même occasion le nombre d?objets contenus dans la liste d?affichage. Un objet d?affichage est toujours typé (au même titre qu?une occurrence de symbole est de type MovieClip, Bouton ou Graphique). Le schéma de la figure 2-2 présente les différents types d?objets (ou classes) disponibles dans une animation Flash. Précisons ici la notion d?héritage : un objet hérite des caractéristiques (propriétés, méthodes et événements) de l?objet qui se trouve immédiatement au-dessus de lui dans la hiérarchie. Figure 2-2 Cette arborescence vous présente l?ensemble des classes disponibles en AS3 et leurs héritages respectifs. Tardiveau.Livre Page 37 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 38 Les conteneurs d?objets d?affichage Voici les différentes types de conteneurs d?objets d?affichage. ? Il est conseillé d?utiliser les instances de la classe Loader() pour charger des images sur la scène (ou également des SWF). ? Les instances de la classe Sprite() servent à définir les zones principales de l?interface de votre animation. D?une façon plus générale, la fonction d?une instance de Sprite() est de contenir d?autres instances. ? Les instances de la classe MovieClip() sont comparables à celles de la classe Sprite() à un détail près : elles possèdent un scénario (timeline), ce qui signifie qu?elles peuvent contenir des images-clés. La section Structurer une mise en page avec les classes Sprite() ou MovieClip() permet de mieux comprendre comment organiser la construction d?une image. Les objets d?affichage Commençons par préciser que les objets d?affichage énumérés ci-dessous peuvent être obtenus par l?exécution d?instructions en ActionScript ou en utilisant les outils et les commandes proposés dans l?interface de Flash. Lorsqu?un objet d?affichage est placé sur la scène, il ne peut pas servir de conteneur d?affichage. Prenons l?exemple d?un rectangle tracé sur la scène avec un outil de dessin. Vous pouvez définir ses propriétés (couleurs de fond et de contour, épaisseur du trait, etc.), mais pas lui ajouter une image ou un texte. L?instruction « ajoute une image bitmap dans le rectangle que tu viens de dessiner sur la scène » ne signifierait d?ailleurs rien. En revanche, si nous précisions « ajoute une image bitmap dans le clip que tu viens de créer à partir du rectangle que tu avais préalablement dessiné », cela aurait plus de sens : vous comprendriez qu?il faut éditer le symbole pour lui ajouter une image bitmap. Le clip est alors, dans ce cas, un conteneur d?objets d?affichage. Voici une liste des différents types d?objets d?affichage. ? Shape : permet de tracer dynamiquement des droites, des courbes et des formes géométriques sur la scène (à l?aide des outils de l?interface ou en faisant appel à des instructions en AS3). ? Bitmap : permet d?afficher une image bitmap sur la scène (en important une image à partir du menu Fichier>Importer ou à l?aide d?instructions en AS3). Rappel Avant la création de la classe Sprite() (apparue dans Flash CS3), le MovieClip servait de conteneur d?affichage sans avoir pour autant les mêmes avantages que les instances de la classe Sprite(). Tardiveau.Livre Page 38 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 39 ? TextField : permet de créer un texte dynamique sur la scène (à l?aide de l?outil Texte, disponible dans la barre d?outils de l?interface, ou d?instructions en AS3). ? Video : permet d?afficher une vidéo sur la scène (à l?aide du symbole de type Video ou d?instructions en AS3). Les instances des classes MorphShape, StaticText et SimpleButton ne peuvent pas être créées dynamiquement à partir d?instructions ActionScript, mais elles constituent tout de même des objets d?affichage. Vous aurez compris qu?il faut distinguer deux types d?objets d?affichage : ceux qui servent à regrouper plusieurs objets d?affichage en un seul (les conteneurs) et ceux qui ne servent à contenir qu?un seul élément (un texte, une image, une vidéo, une forme). La difficulté relative aux objets d?affichage n?est pas de différencier ces deux types pour savoir quand utiliser l?un ou l?autre : ce choix découlera directement de vos besoins. Il s?agit plutôt d?être capable de définir judicieusement l?ensemble des conteneurs de votre animation. Différence entre un objet d?affichage et une occurrence En AS1/2, les notions d?objet d?affichage et de conteneur d?objets d?affichage n?existaient pas : nous parlions alors, à tort, uniquement d?occurrence et d?instance. Généralement, le terme occurrence faisait référence à la représentation graphique d?un symbole sur la scène, alors qu?une instance résultait de l?instanciation d?une classe. Malheureusement, ce que peu de personnes savaient, c?est qu?un glisser-déplacer d?un symbole sur la scène revenait à instancier celui-ci. Nous pouvions donc parler d?instance pour évoquer une occurrence. Certains développeurs maîtrisant correctement la program- mation orientée objet utilisaient et utilisent toujours ce terme. Aujourd?hui, avec la nouvelle méthode qui permet de placer un symbole sur la scène à partir de l?ActionScript, la notion d?instance prend tout son sens. Partons du postulat qu?une occurrence et une instance désignent la même chose, la repré- sentation d?un symbole ou un exemplaire d?une classe. Lorsque, par exemple, nous plaçons un symbole de type Clip sur la scène, parle-t-on d?objet d?affichage (et de quel type) ou d?occurrence/instance ? Un TextField Il s?agit d?une zone de texte dont le contenu peut être modifié dynamiquement au cours du déroulement de l?animation. Ce changement peut être réalisé par le programme ou directement via l?interface de l?animation par une saisie de l?utilisateur. Remarque Le terme occurrence se traduit en anglais par instance ! Tardiveau.Livre Page 39 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 40 Il s?agit en fait des deux, ce que résume le script ci-dessous. var monMessage = new TextField(); monMessage.text = "Bonjour"; addChild(monMessage); monMessage.x=50; monMessage.y=50; Pour créer un texte dynamique ou de saisie sur la scène, nous créons une instance de la classe TextField(). Nous ajoutons ensuite cette instance à la liste d?affichage : elle fait donc partie de cette liste en tant qu?objet d?affichage. En définissant les propriétés x et y de l?instance monMessage, nous utilisons le fait que l?objet d?affichage est encore une instance. Structurer une mise en page avec les classes Sprite() ou MovieClip() Pour construire et gérer les différentes parties d?une animation, les utilisateurs de Flash, dont le profil est plutôt graphique, se servent généralement du scénario proposé dans l?interface du logiciel. Le déplacement de la tête de lecture fait alors apparaître les diffé- rents écrans de l?animation associés à des images-clés. Nous allons découvrir ici une autre technique, basée sur l?ActionScript, qui, bien qu?elle soit légèrement plus complexe et beaucoup plus abstraite, est plus efficace. En effet, vous avez tout intérêt à gérer les changements d?affichage des différentes zones de votre animation en ajoutant et en supprimant, ou en affichant et en masquant, les objets d?affichage présents sur la scène. Cela sous-entend que l?analyse de l?interface de votre animation a permis de définir des zones principales et des zones secondaires. Dans l?exemple ci-contre, vous pouvez constater que la mise en pages du site macgeneration est basée sur la grille que nous mettons en évidence dans la figure 2-4. Sans parler d?ergonomie, qui reste tout de même un objectif inéluctable lors de la construction d?une interface, vous noterez que la simplicité de lecture de cette page est due à une bonne structure. Pour celles et ceux d?entre vous qui utilisent les CSS, vous comprendrez toute l?importance des développements suivants. Avec l?arrivée de l?ActionScript 3, l?utilisation de la classe Sprite() nous permet d?orga- niser une mise en page sous la forme de blocs, c?est-à-dire des zones délimitant les diffé- rentes parties d?une animation. Par exemple, le découpage proposé dans la figure 2-4 (qui permet d?obtenir le résultat de la figure 2-3) contient des instances de la classe Sprite(). Lorsque vous ferez appel à la classe Sprite() pour définir le point d?ancrage des différentes zones du quadrillage de votre mise en page, vous définirez ses coordonnées x et y. Point d?ancrage d?une zone Il s?agit du coin supérieur gauche d?un rectangle délimitant une zone. Tardiveau.Livre Page 40 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 41 Figure 2-3 La mise en forme de cette page est composée de zones. Figure 2-4 Le quadrillage de gauche met en évidence les zones principales du site macgeneration, à l?intérieur desquelles figurent des zones secondaires, présentées dans le quadrillage de droite. Tardiveau.Livre Page 41 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 42 La méthode addChild() Cette méthode constitue l?action élémentaire pour placer dynamiquement un objet d?affi- chage ou un conteneur d?objets d?affichage sur la scène (ou dans une instance déjà présente sur la scène). En conséquence, l?objet ou le conteneur est ajouté à la liste d?affichage. Lorsque vous aurez besoin de placer un symbole (avec liaison) de la bibliothèque sur la scène, vous utiliserez la méthode addChild(). Celle-ci vous servira également à placer dynamiquement un texte sur la scène, après avoir créé une instance de la classe TextField(). Elle sera encore utile à l?instanciation d?une classe personnelle, dans le but de construire un objet d?affichage sur la scène. Nous pourrions continuer ainsi l?énumération des cas où vous emploieriez la méthode addChild() ; non seulement, elle ne serait pas exhaustive, mais cela ne servirait à rien. Vous comprendriez vite que cette méthode a toujours le même rôle : rendre visible sur la scène des instances préalablement créées. Maintenant que nous savons définir les objets d?affichage et les conteneurs d?objets d?affichage et que nous connaissons leur rôle, nous devons apprendre à les gérer dans une animation et donc faire appel à la méthode addChild(). Tout d?abord, distinguons les instances que vous placerez directement sur la scène de celles que vous ajouterez dans des instances (des conteneurs d?objets d?affichage) déjà présentes sur la scène. En considérant l?exemple de la figure 2-5, nous devons commen- cer par créer directement 6 instances de la classe Sprite() sur la scène. Nous pourrons ensuite y ajouter des objets d?affichages. Note aux anciens développeurs en AS1/AS2 Les méthodes createEmptyMovieClip() et attachMovie() en AS1/AS2, ne peuvent plus être utili- sées. Elles ont été partiellement remplacées par la méthode addChild(). Figure 2-5 Les six zones de cette mise en page sont définies par des instances de la classe Sprite(). Tardiveau.Livre Page 42 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 43 Fichier de référence : Chapitre2/addChildQuadrillage.fla var spEnTete:Sprite = new Sprite(); var spChapeau:Sprite = new Sprite(); var spMargeGauche:Sprite = new Sprite(); var spCorpsGauche:Sprite = new Sprite(); var spCorpsDroite:Sprite = new Sprite(); var spMargeDroite:Sprite = new Sprite(); addChild(spEnTete); addChild(spChapeau); addChild(spMargeGauche); addChild(spCorpsGauche); addChild(spCorpsDroite); addChild(spMargeDroite); Nous avons ajouté le préfixe sp devant chaque nom d?occurrence. Cela ne constitue en aucun cas une obligation, mais un simple repère visuel pour reconnaître qu?il s?agit d?une occurrence de la classe Sprite(). Comme nous n?avons précisé aucune position, les instances sont placées par défaut en haut à gauche de la scène. Ajoutons les instructions suivantes pour obtenir la mise en page de la figure 2-5. spEnTete.x =10; spEnTete.y =10; spChapeau.x =10; spChapeau.y =90; spMargeGauche.x =10; spMargeGauche.y =120; spCorpsGauche.x =135; spCorpsGauche.y =120; spCorpsDroite.x =515; spCorpsDroite.y=120; spMargeDroite.x =700; spMargeDroite.y =120; Les zones nommées dans notre interface étant définies, il est alors facile de programmer la suite du script. En nous basant sur la figure 2-4, nous allons ajouter deux zones (et non 4) pour pouvoir placer des textes. var partieHaut:Sprite = new Sprite(); var partieBas:Sprite = new Sprite(); partieBas.y=100; spMargeGauche.addChild(partieHaut); spMargeGauche.addChild(partieBas); Tardiveau.Livre Page 43 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 44 Il est important de comprendre que la valeur 100, spécifiée à la troisième ligne du script, positionne l?instance à 220 pixels du haut de la scène, l?instance parent de l?instance partieBas se trouvant déjà à 120 pixels du haut de la scène. Nous pouvons terminer cet exemple en ajoutant deux textes dans les instances partieHaut et partieBas. var boutonAccueil:TextField = new TextField(); boutonAccueil.text="Accueil"; partieHaut.addChild(boutonAccueil); var boutonContact:TextField = new TextField(); boutonContact.text="Contact"; partieBas.addChild(boutonContact); Voici à présent une illustration du principal avantage de la liste d?affichage de l?AS3. Pour contrôler ou lire les propriétés de l?instance boutonAccueil, il est inutile de se référer à cette dernière en spécifiant un chemin à base de syntaxe pointée. Il suffit tout simple- ment d?écrire le nom de cette occurrence dans une instruction. Comme elle se trouve dans la liste d?affichage, sa position dans l?arborescence est parfaitement connue. trace(boutonAccueil.text); trace(boutonContact.text); Le script ci-dessus provoque l?affichage des mots « Accueil » et « Contact » dans la fenê- tre Sortie de l?interface de Flash. Dans la figure 2-1, nous vous avions présenté un exemple d?arborescence de la liste d?affichage. Voici à présent la représentation de notre animation. Remarque L?instruction partieBas.y=100 peut être placée avant ou après la méthode addChild(). Figure 2-6 Arborescence de la liste d?affichage de notre animation. Tardiveau.Livre Page 44 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 45 Rappelons tout de même qu?une mise en page d?instances sur la scène de Flash n?est pas toujours basée sur des grilles comme celles que nous venons de présenter. Voici un deuxième exemple, l?interface d?un DVD-Rom, où nous avons créé des instances de la classe Sprite() pour définir des zones qui se trouvent à différents endroits sur la scène. La mise en page obtenue est présentée dans la figure 2-7. La structure correspondante est exposée dans la figure 2-8. Dans l?exemple de la figure 2-8, vous observerez que nous avons tracé des zones sous la forme de rectangles blancs transparents. En réalité, la largeur et la hauteur de ces blocs n?ont pas été définies car nous n?avons spécifié que l?emplacement des instances de la classe Sprite(). Ces positions sont représentées par les carrés noirs de la figure 2-8. Vous noterez que le rectangle situé en bas à gauche de l?interface possède son point d?ancrage à droite. En effet, nous avons attaché un texte dynamique à cette zone, mais avec un alignement de texte à droite. Figure 2-7 Cette mise en page ne peut pas s?appuyer sur un quadrillage, mais nous utilisons tout de même des instances de la classe Sprite() pour définir des zones. Tardiveau.Livre Page 45 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 46 Voici à présent un dernier exemple qui résume tout ce que nous venons de voir avec une approche plus simplifiée. Fichier de référence : Chapitre2/addChild.fla var marge:Sprite = new Sprite(); addChild(marge); var corps:Sprite = new Sprite(); addChild(corps); corps.x=100; var texte1:TextField = new TextField (); texte1.text="Zone de\rla marge"; corps.addChild(texte1); var texte2:TextField = new TextField (); texte2.text="Zone du corps\rde la page"; marge.addChild(texte2); Figure 2-8 Les blocs de cette mise en page facilitent le développement, notamment pour ajouter ou supprimer un objet d?affichage. Tardiveau.Livre Page 46 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 47 Contrôler l?ajout d?objets d?affichage avec l?événement ADDED Lorsque vous ajouterez un objet d?affichage à la liste d?affichage, vous aurez la possibilité d?exécuter une ou plusieurs actions telles qu?un test, un comptage, le réglage d?une propriété, etc. La technique est extrêmement simple car il suffit d?utiliser l?événement ADDED. Dans l?exemple ci-dessous, à chaque ajout d?un objet d?affichage dans l?instance spMarge, nous affichons, dans la fenêtre Sortie, le nombre d?enfants de cette instance. var spMarge:Sprite = new Sprite(); addChild(spMarge); spMarge.addEventListener(Event.ADDED,afficherInfo); function afficherInfo(evt:Event) { trace(spMarge.numChildren); } var commande1:TextField = new TextField(); commande1.text="Accueil"; spMarge.addChild(commande1); var commande2:TextField = new TextField(); commande2.text="Contact"; spMarge.addChild(commande2); Cet événement s?avère très pratique pour mettre à jour certaines informations lors de chaque ajout d?un objet d?affichage à la liste d?affichage. La propriété stage Comme le précise très clairement le titre de cette section, la scène d?une animation est une propriété et non un objet directement accessible. Avec l?AS1/AS2, il était possible de faire référence à la scène en tant qu?instance : elle représentait alors la racine d?un document. Rappelons que la classe Stage() était une classe de niveau supérieur. Lorsque nous écrivions le mot Stage (avec un S majuscule), nous faisions alors référence à la scène de l?animation Flash. Remarque Si le terme objet vous gêne et si vous avez déjà écrit des scripts en AS1/AS2, remplacez-le par le terme instance ou occurrence. Tardiveau.Livre Page 47 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 48 Pour afficher la largeur d?une occurrence dans la fenêtre Sortie de Flash nous devions écrire l?instruction suivante : trace(nomDuneOccurrence._width); La largeur de la scène pouvait être affichée à l?aide de l?instruction : trace(Stage.width); En ActionScript 3, toutes les instructions ci-dessous renvoient le même résultat, c?est-à- dire le chiffre 600 qui correspond à la largeur de la scène. trace(stage.stageWidth); trace(this.stage.stageWidth); trace(rond.stage.stageWidth); trace(carre.stage.stageWidth); Une animation désignée par this à la racine d?un script, possède ainsi une propriété stage. Toutes les occurrences placées sur la scène, que nous devons qualifier d?objet d?affichage (ou DisplayObject), possèdent également la propriété stage qui se réfère à la celle de l?animation. En conséquence, si nous essayons d?afficher this à partir d?une image-clé de l?animation, nous obtenons : trace(this); Ce résultat peut se traduire par « objet de type timeline principale ». Pour celles et ceux qui ont bien compris la notion de programmation objet, voici ce que renvoie le script ci-dessous, qui se trouve dans la classe du document d?une animation. package { import flash.display.Sprite; public class main extends Sprite { function main() { trace(this); trace(this.stage); trace(this.stage.stageWidth); } } } Pourquoi rencontre-t-on le mot stage en début de ligne dans le premier des quatre exemples ? Aux 3e et 4e lignes de code, nous faisons référence à une instance particulière. Lorsque ce n?est pas le cas, comme à la première ligne, l?instance considérée est this. [object MainTimeline] [object main] [object Stage] 600 Tardiveau.Livre Page 48 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 49 Supprimer un objet de la scène à l?aide de la méthode removeChild() Il est parfois nécessaire de supprimer un objet de la liste d?affichage. Avant de vous proposer un exemple faisant appel à cette technique de suppression d?une instance sur la scène, il est important de préciser ou de rappeler que, dans certains cas, il sera plus judicieux de faire appel à la propriété visible que vous réglerez à false pour masquer temporairement une occurrence, plutôt que de la supprimer de la liste d?affichage. La procédure de suppression d?un objet d?affichage de la liste d?affichage est extrêmement simple : elle se résume à l?exécution d?une seule instruction. removeChild(cache1); L?appel de cette méthode, sous-entend bien sûr l?exécution préalable des lignes d?instructions suivantes : var cache1:Carte; cache1 = new Carte(); addChild(cache1); Que devient l?instance cache1 après l?exécution de la méthode removeChild() ? En fait, elle existe toujours ; si vous demandez d?ajouter à nouveau cette instance à la liste d?affichage, elle est automatiquement replacée. Voici un exemple de synthèse des explications ci-dessus. Remarque La classe Stage() était une classe de niveau supérieur en AS1/AS2, ce qui n?est plus le cas en AS3. Classes de niveau supérieur en AS1/2 : Accessibility, Array, AsBroadcaster, Boolean, Button, Camera, Color, ContextMenu, ContextMenuItem, CustomActions, Date, Error, Function, Key, LoadVars, LocalConnection, Math, Microphone, Mouse, MovieClip, MovieClipLoader, NetConnection, NetStream, Number, Object, PrintJob, Selection, Selection, SharedObject, Sound, Stage, String, System, TextField, TextFormat, TextSnapshot, Video, XML, XMLNode, XMLSocket, XMLUI. Classes de niveau supérieur en AS3 : Array, Boolean, Date, decodeURI, decodeURIComponent, encodeURI, encodeURIComponent, escape, int, isFinite, isNaN, isXMLName, Number, Object, parseFloat, parseInt, String, trace, uint, unescape, XML. Remarque Une occurrence qui a été obtenue sur la scène à partir d?un glisser-déplacer peut être supprimée à partir de la méthode removeChild() contrairement la méthode removeMovieClip() que nous utilisions en AS1/2. Remarque L?occurrence ne sera plus visible sur la scène, mais elle conservera ses propriétés. Tardiveau.Livre Page 49 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 50 Fichier de référence : Chapitre2/removeChild1.fla var cache1:Carte; cache1 = new Carte(); addChild(cache1); cache1.x = 250; cache1.y =130; btSuppression.addEventListener(MouseEvent.MOUSE_DOWN,retirerCache); function retirerCache(evt:MouseEvent) { removeChild(cache1); } btReplacement.addEventListener(MouseEvent.MOUSE_DOWN,replacerCache); function replacerCache(evt:MouseEvent) { addChild(cache1); } Si vous souhaitez supprimer l?objet d?affichage et plus précisément l?instance de la classe Carte, vous devez lui attribuer la valeur null, après l?avoir retirée de la liste d?affichage. Contrôler la suppression d?objets d?affichage avec l?événement REMOVED_FROM_STAGE Fichier de référence : Chapitre2/removeChild4.fla Il est intéressant et important de savoir qu?à partir du moment où un objet d?affichage est supprimé de la liste d?affichage, l?événement REMOVED_FROM_STAGE est déclenché. Ainsi, dans l?exemple ci-dessous, cela permet de tenir une comptabilité des occurrences sur la scène. var nbrCartes:Number = 3; affichageNbrCartes.text= nbrCartes.toString(); bt1.addEventListener(Event.REMOVED_FROM_STAGE ,comptabiliserCarte); bt2.addEventListener(Event.REMOVED_FROM_STAGE ,comptabiliserCarte); bt3.addEventListener(Event.REMOVED_FROM_STAGE ,comptabiliserCarte); bt1.addEventListener(MouseEvent.MOUSE_DOWN ,supprimerCarte); bt2.addEventListener(MouseEvent.MOUSE_DOWN ,supprimerCarte); bt3.addEventListener(MouseEvent.MOUSE_DOWN ,supprimerCarte); function comptabiliserCarte(evt:Event) { nbrCartes--; affichageNbrCartes.text= nbrCartes.toString(); } function supprimerCarte(evt:Event) { removeChild(DisplayObject(evt.currentTarget)); } Tardiveau.Livre Page 50 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 51 Un tel gestionnaire d?événement facilite la gestion de la suppression de certaines catégo- ries d?occurrences dans des jeux. Nous allons découvrir, dans un deuxième exemple, que la méthode removeChild() doit être précédée du nom du conteneur d?objets d?affichage qui contient l?objet d?affichage que nous souhaitons supprimer. Au cours de ce chapitre, nous avons découvert qu?il est judicieux de regrouper certaines occurrences au sein d?un même conteneur. Ainsi, vous devez préfixer la méthode addChild() d?un nom de conteneur. Ce nom devra également être placé devant removeChild(). Dans cet exemple, nous créons une instance de la classe Sprite() pour accueillir 3 objets d?affichage. Puis, nous programmons un bouton qui, lorsqu?on clique dessus, retire tous les objets d?affichage contenus dans l?instance tableJeu. Fichier de référence : Chapitre2/removeChild2.fla var tableJeu:Sprite; tableJeu = new Sprite(); addChild(tableJeu); var cache1:Carte; var cache2:Carte; var cache3:Carte; cache1 = new Carte(); cache2 = new Carte(); cache3 = new Carte(); tableJeu.addChild(cache1); tableJeu.addChild(cache2); tableJeu.addChild(cache3); cache1.x = illustrationTrain.x; cache1.y =130; cache2.x = illustrationBateau.x; cache2.y = 130; cache3.x = illustrationAvion.x; cache3.y = 130; Remarque Afin qu?il n?y ait aucune confusion, si vous souhaitez connaître le nombre d?objets d?affichage contenus dans un conteneur ou sur la scène, vous pouvez utiliser la propriété numChildren. Ainsi, l?instruction ci-dessous (à placer sur une image-clé) permet de connaître le nombre d?objets d?affi- chage contenus sur la scène. trace(this.numChildren); Tardiveau.Livre Page 51 Lundi, 18. f vrier 2008 3:37 15 ActionScript 3 ? Programmation séquentielle et orientée objet 52 btSuppression.addEventListener(MouseEvent.MOUSE_DOWN,retirerCache); function retirerCache(evt:MouseEvent) { tableJeu.removeChild(cache1); tableJeu.removeChild(cache2); tableJeu.removeChild(cache3); } Nous allons découvrir, dans un troisième et dernier exemple, une mauvaise surprise. Pour mieux la comprendre examinons la signature de la méthode removeChild(). Observez bien le type d?information contenu entre les parenthèses ! La méthode prend en paramètre le nom d?un objet d?affichage. Mais alors, lorsque nous programmons une fonction de rappel (CallBack) qui fait référence à la propriété currentTarget pour identifier un objet d?affichage à supprimer, comment préciser qu?il s?agit d?un objet d?affichage ? Dans l?exemple ci-dessous, la ligne d?instruction ne peut pas être exécutée. removeChild(evt.currentTarget); Vous devez donc faire appel à la classe DisplayObject() pour préciser au compilateur que le paramètre evt.currentTarget est bien un objet d?affichage. removeChild(DisplayObject(evt.currentTarget)); Voici un exemple complet qui illustre notre propos. Fichier de référence : Chapitre2/removeChild3.fla var cache1:Carte; var cache2:Carte; var cache3:Carte; cache1 = new Carte(); cache2 = new Carte(); cache3 = new Carte(); addChild(cache1); addChild(cache2); addChild(cache3); cache1.x = illustrationTrain.x; Figure 2-9 La méthode removeChild() prend pour paramètre un nom de type DisplayObject, c?est-à-dire un objet d?affichage (ou celui d?un conteneur d?objets d?affichage). Tardiveau.Livre Page 52 Lundi, 18. f vrier 2008 3:37 15 La gestion des occurrences sur la scène CHAPITRE 2 53 cache1.y =130; cache2.x = illustrationBateau.x; cache2.y = 130; cache3.x = illustrationAvion.x; cache3.y = 130; cache1.addEventListener(MouseEvent.MOUSE_DOWN,retirerCache); cache2.addEventListener(MouseEvent.MOUSE_DOWN,retirerCache); cache3.addEventListener(MouseEvent.MOUSE_DOWN,retirerCache); function retirerCache(evt:MouseEvent) { removeChild(DisplayObject(evt.currentTarget)); } removeChildAt() Cette dernière méthode vous permettra de supprimer un objet d?affichage en spécifiant un numéro d?index. Afin de mieux comprendre le fonctionnement des index liés aux objets d?affichage, consultez le chapitre 4 de ce livre et plus particulièrement la section Gérer les plans entre deux ou plusieurs occurrences. Tardiveau.Livre Page 53 Lundi, 18. f vrier 2008 3:37 15

PARTAGER SUR

Envoyer le lien par email
1746
READS
15
DOWN
7
FOLLOW
4
EMBED
DOCUMENT # TAGS
#flash  #action script  #développement flash 

licence non indiquée


DOCUMENT # INDEX
Divers 
img

Partagé par  mistigri

 Suivre

Auteur:Tardiveau
Source:Non communiquée