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
Attention : Les variables sont sensibles à la casse. Ecrivez :
Truc = 44
trace (Truc)
trace(TRUC)
Résultat :
44
undefined
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.
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 :
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.
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.)
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.
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)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
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...
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.
---