Les variables

Notions de base

Avec ActionScript 2.0, vous n'êtes pas obligé de déclarer les variables.

Si une variable n'est pas déclarée, elle est égale à undefined. Essayez d'écrire ce code dans une nouvelle animation, dans l'unique image-clé du seul calque existant :

Truc = 44
trace (Truc)

Le résultat est l'affichage de :

44

Sensibilité à la casse

Attention : Les variables sont sensibles à la casse. Ecrivez :

Truc = 44
trace (Truc)

trace(TRUC)

Résultat :

44
undefined

Mélange de types

Attention au mélange de types de données : cet exemple parle de lui-même :

Truc = 5
Machin = 6
Bidule = "HA HA HA"
trace (Truc + Machin)
trace(Truc + Machin + Bidule)
trace(Bidule + Truc + Machin)

Résultat :

11
11HA HA HA
HA HA HA56

Le signe + concatène (colle l'un à côté de l'autre) les textes entre guillemets (chaîne sde caractères), mais additionne les chiffres.

Ordre de lecture de l'animation

Les variables sont traitées du haut vers le bas et de la gauche vers la droite. Admettons deux calques l'un au dessus de l'autre, et dans le calque du haut :

Truc = 5

et dans le calque du bas

trace (Truc)

Comme ceci :

Le résultat sera 5. Mais si on inverse l'ordre des calques, et que Truc = 5 est dans le calque du bas cette fois, le résultat sera undefined.

Mais si la variable était défine dans l'image 1 du calque 2, et qu'on l'affiche dans la 2ème image du calque 1, la valeur est à nouveau 5. L'ordre est donc :

  1. Calque 1, Image 1
  2. Calque 2, Image 1
  3. Calque 3, Image 1
  4. ... etc jusqu'au dernier calque, ensuite :
  5. Calque 1, Image 2
  6. Calque 2, Image 2
  7. Calque 3, Image 2

etc. C'est pourquoi, lors de l'initialisation des variables, il est conseillé de le faire dans un calque à part, qu'on appellerait "Actions" par exemple, et qui se situerait au dessus de tous les autres.

Accès à une variable depuis un clip

Admettons maintenant que vous créez un clip tout bête dans un autre calque (CLICercle) :

Dans le calque Calque 1, vous avez toujours Truc = 5.

Et maintenant, dans le clip, vous avez le code suivant :

onClipEvent(mouseUp)
  {
  trace (Truc)
  }

Regardez cette page si vous désirez en savoir plus sur le onClipEvent(mouseUp).

Comme Truc existe dans le scénario lui-même et pas dans le clip, en d'autre mots, "à un niveau plus élevé", c'est à dire à la "racine" de l'animation, et en anglais racine se dit root, le résultat est ... undefined !

essayez le code suivant à la place :

onClipEvent(mouseUp)
  {
  trace (_root.Truc)
  }

Cette fois, le résultat est 5.

Maintenant, donnons un nom à notre occurrence de CLICercle : OCCCercle (Avec le panneau des propriétés) :

Afin qu'une variable soit immédiatement initialisée dans ce OCCCercle, placez le code suivant :

onClipEvent(load)
  {
  Machin = 8
  Trace (Machin)
  }

Il va bien sûr afficher 8. Mais maintenant, insérez une image clé en 2ème image de ce calque qui contient déjà le clip : .. Le résultat va être :

8
undefined
undefined
undefined
undefined
...

La première fois, c'est bien 8, car c'est au chargement du cliup, et ensuite undefined, car on ne peut pas accéder comme ça à Machin : c'est une variable du clip. Il fait tout plein de fois undefined, simplement, parce qu'il bopucle automatiquement sur les deux images.

Par contre, on peut y accéder comme ceci :

trace (OCCCercle.Machin)

Et là, il va bien donner toujours 8.

Dans le même ordre d'idées, imaginons qu'on est dans un clip, disons OCCRasoir, et que depuis un événement quelconque onClipEvent, on veut accéder à une variable qui est définie dans un autre clip (disons OCCTelephone), qui est même sur un autre calque, peu importe, on doit écrire :

_root.OCCTelephone.Bidule = 334

ou

_level0.OCCTelephone.Bidule = 334

ou

_parent.OCCTelephone.Bidule = 334
(
Simplement parce que OCCTelephone est un clip situé juste un cran au-dessus de OCCRasoir.)

Clips imbriqués

Il est possible d'avoir des clips imbriqués dans d'autres clips. Soit le clip OCC2 étant inclus dans OCC1 :.

OCC1.OCC2.Truc = 55
trace (OCC1.OCC2.Truc)

Renvoie bien 55.

Déclaration des variables

Bien que ce ne soit pas obligatoire, c'est tout de même plus propre. Le mot-clé var pourvoit à cette utilité. Ecrovons dans la première et unique image-clé de notre seul et unqiue calque d'une nouvelle animation :

var Machin = 4
trace(Machin)

Affiche 4.

Mais si maintenant, on crée un clip sur cette même image, dans lequel on insère ce code :

onClipEvent(load)
  {
  trace (Machin)
  }

Le résultat est undefined. Car la portée de la variable ne va pas jusque dans les clips.

Pour que la variable soit disponible jusque dans les clips, il faut utiliser _global. Essayez ceci :

Code de la première image de l'animation :

_global.Truc = 9
var Machin = 4
trace("Image 1, Truc : " + Truc)
trace("Image 1, Machin : " + Machin)

et dans le clip :

onClipEvent(load)
  {
  trace ("Clip, Truc : " + Truc)
  trace ("Clip, Machin : " + Machin)
  }

L'affichage sera :

Image 1, Truc : 9
Image 1, Machin : 4
Clip, Truc : 9
Clip, Machin : undefined

Interaction des variables et des fonctions

Une page sur les fonctions est présentée ici.

Soit le code suivant, sur la première et unique image-clé d'un calque unique d'une nouvelle animation :

var Truc = 2
function Faire()
  {
  trace (Truc)
  }
Faire()

Affiche : 2 (La variable est valide même dans la fonction). Le code suivant, a peu près jumeau, sauf que le mot-clé var napparait pas:

Truc = 2
function Faire()
  {
  trace (Truc)
  }
Faire()

Affiche aussi 2. Par contre :

Faire()
var Truc = 2

function Faire()
  {
  trace (Truc)
  }

Renvoie undefined, car l'appel de la fonction passe par dessus l'initialisation de la variable sans la lire.

Si on déclare une variable à l'intérieur d'une fonction, la portéle de celle-ci s'arrête à la fin de la fonction. Exemple :

function Faire()
  {
  var Truc = 2
  }
Faire()
trace (Truc)

Renvoie undefined. Ce qui fait qu'on peut avoir deux variables distinctes, avec le même nom ::

var Truc // Variable "globale"
Truc = 5 // égale à 5.
function Faire()
  {
  var Truc // une autre variable Truc, locale à la fonction
  Truc = Truc + 1 // undefined = undefined + 1, càd : Nan
  trace (Truc) // donc Nan
  }
Faire()
trace (Truc) // On revient à notre variable globale : 5

Résultat :

NaN
5

Et maintenant, le comble du tordu :

var Truc = 5 // Variable "globale"
function Faire()
  {
  var Truc = Truc + 1 // Truc local = Truc global (5) + 1, Donc : 6
  trace (Truc) // 6
  }
Faire()
trace (Truc) // Le Truc global n'a pas changé : 5.

Résultat :

6
5

Donc, évitez d'utiliser des variables à portée différentes avec le même nom...

Typage strict

Il est possible, mais seulement depuis ActionScript 2.0, càd depuis Flash MX, d'opérer à un typage strict des variables : Préciser quel sera le genre de donnée qui va être utilisé. Comme ceci : Admettons qu'on destine la variable Truc a contenir un nombre et pas autre chose :

var Truc:Number

Ainsi, si on essaie de lui assigner un autre genre de valeur, il y aura une erreur :

var Truc:Number
Truc = "Tralala"

Affiche :

Incompatibilité de types dans l'instruction d'affectation : String détecté au lieu de Number.

Par contre, Truc = 3.14 fonctionne très bien.

Les trois types scalaires (simples) sont :

var Truc:String
var Machin:Number
var Bidule:Boolean
// true ou false

Attention, car comme souvent, il n'y a pas de garde-fou avec ActionScript : Le code suivant ne génère pas d'erreur :

var Truc:String
var Truc:Number
Truc = "Tralala"

Il se contente d'initialiser Truc comme étant un String (chaîne de caractères), et ne tient simplement pas compte de la 2ème initialisation à Number, qui est pourtant bien à la suite...

Contrairement au langage C, ou il est possible de déclarer des variables "ultra-locales" qui n'ont de portée qu'à l'intérieur des accolades, le code suivant :

var Truc
if (1 == 1)
  {
  var Truc
  Truc = 33
  trace (Truc)
  var Truc
  trace (Truc)
  }
trace (Truc)

Affiche :

33
33
33

Note : que ce soit sur le Web ou dans l'aide en ligne Flash, le typage strict n'a pas l'air d'attiser les passions. Un peu comme s'il était préférable de s'en passer.

Résumé de la portée des variables

---