Les bases d’ActionScript – Part II – Les variables
Rôle et principe des variables
Une variable est un conteneur d’informations. Tout type d’information peut être stocké dans une variable.
Généralement cette information est volatile et peut être modifiée à tout moment et par divers types d’actions : qu’il s’agisse de l’utilisateur, de l’application, du système d’exploitation, ou de l’interaction de divers autres objets entre eux…
Dans sa forme la plus primitive de Flash et d’ActionScript, une variable se présente sous la forme d’une équation, avec à gauche le nom de la variable et à droite sa valeur.
jour = 8 mois = "mars"
Propriétés ou variables d’instances
En programmation, on parle également de propriétés : Les propriétés d’un objet. Mais il s’agit également d’une variable d’instance. Les deux termes sont ainsi équivalents, bien que suivant les ouvrages, ou les littératures, on retrouve tantôt l’un , tantôt l’autre… et certaines fois les deux. Les deux termes représentent la même chose dans Flash, mais la coutume est de dire qu’une animation contient des variables et qu’un MovieClip contient des propriétés. La TimeLine principale n’est également qu’un Clip… donc…. euh…. ne nous prenons pas la tête et appelons variables, tout conteneur que nous allons utiliser temporairement pour stocker des résultats intermédiaires de calcul, et propriétés, tout ce qui nous permettra de stocker des informations propre à des objets particuliers, quel qu’ils soient.
Portée d’une variable
Les variables locales
Avant AS3.0 il était possible d’utiliser le mot clé, var, pour déclarer une variable locale, ou de ne pas l’utiliser pour augmenter la portée de cette variable. Depuis AS3.0 nous n’avons plus le choix, il faut user de var pour initialiser une variable. Laissons AS3.0 de côté et voyons voir ce qu’il en est… de l’utilisation ou de la non utilisation de var. Créez une animation Flash et ouvrez une Action – Image :
uneDonnee = 1 test = function(){ uneDonnee = 0 // var uneDonnee = 0 } test() trace(uneDonnee)
Dans le premier cas, si nous n’utilisons pas le mot clé var, la fenêtre de sortie affiche 0. En fait, la variable uneDonnee est commune et partage le même emplacement dans la mémoire. Donc l’une affecte l’autre, ce qui parait jusque-là normal. Maintenant, inverser le commentaire afin d’utiliser le mot clé var à l’intérieur de la fonction, puis relancez l’animation. Cette fois-ci, la fenêtre de sortie affiche 1. Cela est dû au fait que la seconde variable, uneDonnee, est déclarée comme locale à la fonction et ne pointe donc pas sur le même emplacement que la première variable, uneDonnee, celle qui est en dehors de la fonction.
Faisons, une autre expérience tout aussi parlante, pour mettre en évidence l’aspect local de la création d’une variable, au travers du mot clé var. Créez une nouvelle animation Flash, et dans une fenêtre d’Action – Image, créez une variable sans l’utilisation du mot clé. Testez l’animation :
function test(){ uneDonnee = 1 } test()
Une fois l’animation lancée, appelez le listage des variables depuis le débogueur, Ctrl – Alt – V. Dans la fenêtre de sortie, vous pouvez voir apparaître la variable uneDonnee avec pour valeur 1.
Recommencez l’expérience mais avec cette fois-ci, l’utilisation du mot clé var :
function test(){ var uneDonnee = 1 } test()
Une fois l’animation lancée, appelez à nouveau le listage des variables, et vous constaterez que le player ne connait pas de variable uneDonnee.
Depuis AS3.0
En AS3.0 les variables sont déclarées en usant du mot clé var et doivent être typées. Toutefois, si elles ne le sont pas, ni le compilateur ni le player ne s’en plaindront, et vous pourrez alterner la nature du contenu de la variable. Ouvrez une animation Flash AS3.0, ouvrer la fenêtre de code et tapez :
var test = 5; test = "coucou" trace(test)
La fenêtre de sortie affiche bien « coucou ». Il est ainsi possible de ne pas typer les variables, bien que cela soit fortement recommandé. Pour typer une variable, il suffit de préciser le type juste après sa déclaration :
var test:Number = 5 var autre_test:String = "coucou" autre_test = test
Si vous lancez le compilateur, il va vous afficher le message d’erreur suivant :
1067: Contrainte implicite d'une valeur du type Number vers un type sans rapport String.
Il existe autant de types de déclarations qu’il existe de types d’objets accessibles par le langage ActionScript. Nous verrons que nous pouvons également créer nos propres types d’objets en créant des classes qui porteront le même nom. Par exemple, si nous créons et appelons la classe un_type_personnel, les instances issues de cette classe seront de type un_type_personnel :
var un_objet:un_type_personnel = new un_type_personnel()
Les variables globales
Bien que toute variable puisse être généralisée en la plaçant sur la racine, _root.uneDonnee, il existe le mot clé _global, qui permet de rendre une variable globale à l’ensemble de l’animation. De ce fait, une fois déclarée, cette variable sera accessible de toute part, sans chemin de cible, sauf si une variable du même nom local intervient. Voir l’exemple ci-dessous :
_global.uneDonnee = 0; function test_1() { uneDonnee = 1; } test_1(); trace(uneDonnee); // 1 function test_2() { var uneDonnee = 2; } test_2(); trace(uneDonnee); // 1
Le _root
Comme nous l’avons abordé lors de l’exploration du chemin de cible, l’adresse absolue se compose toujours à partir de la racine de l’animation, c’est à dire _root. Par contre, nous allons rencontrer une ambiguïté de nommage entre l’interpréteur Flash et celui du player. Le plus simple pour le mettre en évidence reste de tracer le _root. Donc créez une animation et dans une Action – Image tapez :
trace(_root);
Une fois que vous lancez l’animation, la fenêtre de sortie affiche _level0. Il s’agit du premier niveau dans lequel le player lance les animations. Il peut y avoir autant de niveau que souhaité. Dans ce cas précis, _root est équivalent à _level0. Là où les choses se corsent, c’est si nous sommes amenés à charger une animation dans une autre. Il y a deux cas de figures : soit on charge l’animation hébergée dans un autre niveau, par exemple en _level100, soit on charge l’animation dans un clip de la première.
Chargé dans un niveau
Dans ce cas de figure, le _root de l’animation chargée équivaut à _level100 et surtout, toutes les variables de cette animation définies en adresses absolues, donc utilisant _root, restent préservées et continuent de fonctionner correctement.
Chargé dans un clip
Cette fois-ci, le player considère que l’animation chargée devient partie intégrante de l’animation hôte et donc le _root de l’animation chargée équivaut à _levl0. De plus, toutes les variables utilisant _root dans leur chemin de cible, localiseront leur recherche sur l’animation hôte et non plus sur l’animation où elles sont censées se trouver.
Mise en évidence
Pour le mettre en évidence, construisons deux animations Flash, une animation hôte et une animation chargée. L’animation hôte contient un clip vide appelé ‘cnt’ et deux boutons appelés respectivement ‘bt_niveau’ et ‘bt_clip’. Sur le calque Action – Image, plaçons le code suivant :