Utilisation des variables en ActionScript 3 (AS3)
En programmation, les variables sont utilisées pour stocker des données. Nous allons voir à travers ce billet, l'utilisation des variables en AS3.
Déclarer une variable
Le mot clé var est obligatoire en AS3 pour déclarer une variable
-
// Le mot clé var est obligatoire en AS3 pour déclarer une variable
-
var i;
-
// Il est fortement recommandé de désigner le type de la variable. Sans cette désignation, un avertissement apparaît à la compilation en mode strict.
-
var j:int;
Valeur d'une variable
On peut parfaitement donner une valeur à la variable au moment de sa création. Une variable, déclarée sans valeur, se verra affectée une valeur par défaut
-
// On peut parfaitement donner une valeur à la variable au moment de sa création
-
var largeur:int = 100;
-
// Une variable déclarée sans valeur, se verra affectée une valeur par défaut
-
var o:int, p:String, q:Boolean, r:Number, s:Object, t;
-
trace("valeur par défaut d'un entier : "+o+"\n"+ "valeur par défaut d'une chaîne de caractères : "+p+"\n"+ "valeur par défaut d'un booléen : "+q+"\n"+ "valeur par défaut d'un nombre : "+r+"\n"+ "valeur par défaut d'un type object : "+s+"\n"+ "valeur par défaut d'une variable non typée : "+t);
Grouper des déclarations de variables
Pour simplifier la lecture du code, les déclarations de variables peuvent être groupées même si le type des variables est différent
-
// Les déclarations de variables peuvent être groupées var k:int=1, l:int=10, m:int=20;
-
// On peut grouper des variables de types différents
-
var ville:String="Nantes", dep:int=44, prefecture:Boolean=true;
-
trace("Ville : "+ville+"\nDépartement : "+dep+"\nPréfécture : "+prefecture);
Portée des variables
Une variable peut-être globale donc utilisable à partir de n'importe quelle ligne de votre script ou locale donc utilisable uniquement dans la fonction ou elle a été créé.
-
/*** Portée des variables ***/
-
// Une variable globale est une variable qui est défini en dehors d'une fonction ou d'une classe
-
var globale:String = "Flash 9";
-
// Une variable globale est accessible depuis et en dehors d'une fonction
-
trace("Valeur de la variable en dehors de la fonction : "+globale);
-
function testPortee():void
-
{
-
trace("Valeur de la variable depuis la fonction : "+globale);
-
}
-
testPortee();
-
// Une variable locale est une variable qui est déclarée dans une fonction
-
function porteeLocale():void
-
{
-
var locale:String = "Adobe Flash ActionScript 3";
-
trace("Valeur de la variable depuis la fonction : "+locale);
-
}
-
porteeLocale();
-
//trace("Valeur de la variable en dehors de la fonction : "+locale);
Il n'existe pas de limitations comme en Java ou en C++ pour les variables déclarées à l'intérieur des accolades d'un bloc d'instructions.
[as]/* Variables déclarées dans un bloc d'instructions Contrairement aux langages Java ou C++, les variables déclarées entre les accodales d'un bloc d'instructions ne se limitent pas à ce bloc d'instructions. La portée de ces variables est défini par l'élément parent*/
var a:int = 10; var b:int = 20;
if(a<b)
{
var c:int=a;
trace("La valeur de c à l'intérieur des accolades du if est "+c);
}
trace("La valeur de c à l'extérieur des accolades du if est "+c);// la portée de c ne se limite pas qu'aux accolades du if et c est une variable globale car défini en dehors d'une fonction
var d:int = 30; var e:int = 40;
function comparaison(d:int, e:int):void
{
if(d<e)
{
var f:int=d;
trace("La valeur de f à l'intérieur des accolades du if est "+f);
}
trace("La valeur de f à l'extérieur des accolades du if est "+f); //la portée de f ne se limite pas qu'aux accolades du if
}
comparaison(d,e);
trace("La valeur de f à l'extérieur des accolades du if et à l'extérieur de la fonction est "+f); // par contre, f étant défini dans une fonction, sa portée est locale donc le trace provoque une erreur[as]
;)
Je suis Antony Chauviré, développeur sur la Flash Platform.
En mode strict avec le compilateur faut se méfier de pas mal de chose avec les variables...
1 - impossible de déclarer 2 fois une même variable dans un bloc de fonction avec un var
2 - vaut mieux mettre dans tous les cas le typage fort et utiliser le typage * si on ne sait pas le type ?
3 - Faire attention au typage forcé sur un Number, int et uint... si tu fais :
var n:Number = 2 ; // le type devient uint automatiquement en AS3
etc.. etc.. c'est vraiment passionnant de connaitre parfaitement les réactions de l'AS3 avec les types, variables, fonctions, classes etc...
J'espère comme toi écrire prochainement des articles à ce sujet car cela me plait beaucoup de voir l'évolution du language et de l'ECMAScript aussi :)
EKA+ :)
Salut,
[quote]var n:Number = 2 ; // le type devient uint automatiquement en AS3[/quote]
tu tires d'ou l'information ? :) Ou comment tu as testé ca ? ca m'intéresse ^^
[quote]Il n'existe pas de limitations comme en Java ou en C++ pour les variables déclarées à l'intérieur des accolades d'un bloc d'instructions.[/quote]
ca par contre je trouve un peu dommage, car c'est une question de logique :) Pour un développeur relisant le code, si une variable est déclarée dans un if, il me parait logique qu'elle ne sera pas utilisée en dehors. Enfin je pense que cela vient de la souplesse du langage.
En tout cas merci pour les infos :P
@++
@thecaptain
J'ai trouvé cela facilement en codant la version AS3 de VEGAS.
Pour faire un test suffit de taper un flash.utils.getQualifiedClassName() sur ton instance et tu verras ce qu'il se passe ;)
var n:Number = 25 ;
var name:String = getQualifiedClassName(n) ;
trace("n : " + n + " : " + name) ;
En bossant sur la version d'EDEN pour Vegas.. je me suis vite rendu compte de ce petit truc ;) Dans un sens c'est top que les types d'optimisent tout seul... d'un autre côté on découvre que les int et uint sont pas des vrais types... et cela cause parfois des problèmes...
Pour ce qui est de la déclaration de variable, je préfère la souplesse de l'ECMAScript à celle du JAVA ^_^ c'est clair que c'est une question de point de vue à mon avis :)
eKA+ :)
@ekameleon
ah oui bien vu le getQualifiedClassName ! J'ai lu aussi dans la doc que int et uint sont considérés comme des objets eux-aussi et non comme type de base (ce qui peut paraître bizarre puisque pas de majuscule)... c'est cela que tu entends par "pas des vrais types" ?
Sinon en effet pour la soupless, c'est une question de point de vue :) Mais lorsque tu code en équipe avec des juniors, si c'est pas clairement réglementé tu peux faire long avant de saisir le principe d'un code ^^
@++
Bonjour,
Par contre, si tu fait un typeof de ta variable, il te sort uniquement le type Number même si ta variable est de type Number, int, uint.
var v1:int = -10;
var v2:uint = 10;
var v3:Number = 99999;
var v4:Number = 2;
var v5:Number = -2;
trace(typeof(v1), typeof(v2), typeof(v3), typeof(v4), typeof(v5));
Oui car int et uint sont pas des types mais des surcouches de Number :) D'où la difficulté pour retrouvé le type exacte d'un nombre en AS3 ^_^ Cela se compilque donc lors d'une sérialisation/désérialisation par exemple
EKA+ :)
Bonjour,
merci de ces pages qui aide dans la prise de tête avec cet as3 (oui aime pas beaucoup mais suis forcé...)
Dans ce poste sur les variable il manque (en tout cas pour moi) la méthode pour dialoguer avec les variable.
Voici un exemple de mon problème :
voici mon code sur ma scène
import flash.text.TextField;
import flash.display.Sprite;
var varLienVideo:TextField = new TextField();
varLienVideo.x = 10 ;
varLienVideo.y = 10 ;
varLienVideo.width = 120 ;
varLienVideo.height = 20 ;
varLienVideo.text = "Hello World" ;
addChild( varLienVideo );
Ca fonctionne. Ce que je veux, c'est pouvoir modifier la valeur de varLienVideo depuis un clip
Code dans un clip posé sur la scène
varLienVideo.text = "Hello World 2" ;
Ca ne fonctionne pas et même en mettant root ou stage devant. Qulq'un sait comment "pointer" ou accéder à une variable qui n'est pas au meme niveau ?
Tes objets peuvent facilement accéder les uns aux autres s'ils ont le même parent. (cf. getChildAt()... ). Le principe est de remonter au parent et de redescendre sur l'objet qui t'intéresse. Il faut bien entendu connaitre le niveau de l'instance ou l'avoir identifiée (c-à-dire donné un nom d'instance) en la créant avec
var truc = new Bidule()
Tu pourras ensuite faire référence à "truc" dans tout le "domaine" où tu l'as identifié (=l'endroit du code où ta variable truc est connue. C'est ce qu'on appelle la "portée" d'une variable.)
Ses propriétés seront directement accessibles sans le mot clé var.
Exemple 1 : je connais le niveau
var pere:DisplayObjetContener = maVideo.parent()
var autreFils = pere.getChildAt(3)
Exemple 2 : je connais le nom :
truc.text = "mon film n°2"
Autre moyen, plus pénible, mais valable si tu ne connais ni le nom ni le niveau de ton clip : faire une boucle "for... each" ou "for...in" (je sais plus) dans le conteneur afin de lister tous les objets et de choisir celui qui t'intéresse à l'aide d'une propriété par exemple...
Bonjour,
tout d'abord bravo pour le site, il m'aide vraiment beaucoup pour mes projets d'AS3. Je travaillais beaucoup avec Flash 8 et AS2 mais le passage à l'AS3 se révèle très intéressant grâce au site.
J'ai ensuite une petite question concernant la déclaration des variables. J'ai une boucle for each, avec incrémentation d'une valeur entière. A chaque boucle, je souhaiterai créer un nouveau bouton qui possèderai à la fin de son nom, la valeur entière. Un peu de pseudo code si je ne me suis pas fait comprendre :
int valeur = 0;
for each (...)
{
Bouton MenuName+valeur = new Bouton();
...
valeur++;
}
Je souhaiterai que les noms de mes boutons soient : Menu0, Menu1, Menu2, Menu3, etc. Est-ce possible et si oui, comment?
Merci beaucoup!
Romain.
Bonjour Romain
C'est possible de cette façon là :
int valeur = 0;
var bouton:Bouton;
for each (…)
{
bouton = new Bouton();
bouton.name = MenuName+valeur;
…
valeur++;
}
@+
tannoy
Bonjour. Je possède plusieurs clips sur ma scène et j'aimerais savoir si il est possible de créer une variable dans un de ces clips et de créer une condition avec cette variable sur la scène principale. A chaque fois que j'essaye, flash me dit que la variable n'existe pas.
Cordialement
Great blog post, I've been looking for something like that!!
Ellen
Bonjour à tous,
Voila je cherche de l'aide car on m'a refiler un bébé en actionscript et j'y connais rien.. bref je débute ^^
Juste une question : je cherche a savoir ce que represente le '>>' dans le bout de code suivant :
message_sig = arg1 + (this._Controller.Get_Time_Now() >> 12);
car Get_Time_Now() represente le timestamp mais >> 12 ca veux dire quoi ? +12 sec ?
Merci !
Bonjour,
Débutant, je tente de comprendre le fonctionnement de l'AS3 et je vous remercie de l'aide que m'ont apportée les tutos que vous avez publié :)
Par rapport à la réponse de tannoy en #10 :
Je cherche également à incrémenter les noms de mes objets. Par cette méthode, je peux apparemment modifier le nom des objets, mais par la suite, comment modifier leur valeur ?
Exemple :
for(var i:int=1;i<10;i++)
{
var movieClip:MovieClip = new MovieClip();
movieClip.graphics.beginFill(25*i+255*25*1+255*255*25*i);
movieClip.graphics.drawRect(0, 0, 100, 80);
movieClip.graphics.endFill();
movieClip.x = 10+10*i;
movieClip.y = 10+10*i;
addChild(movieClip);
movieClip.name=Rectangle+i;
}
Bon, là j'ai terminé de créer mes rectangles. Mais je voudrais maintenant faire bouger chacun de ces rectangles, mais je ne peux pas utiliser "Rectangle+i.x=3;"
Comment peut-on faire ?
Merci.
Bonjour bebertii,
Tu pourras récupérer un clip par son nom en utilisant la méthode getChildByName().
Bonnes fêtes de fin d'année.
Bonsoir,
J'ai essayé d'ajouter cette ligne, mais je dois prendre en compte que le script doit générer le nom du rectangle :
Si j'ai bien compris avec ce que tu proposes, il faudrait que je connaisse par avance le nombre de rectangles existant. Or je voudrais pouvoir le changer à l'envie. J'ai donc essayé d'adapter en changeant "rectangle1" par "rectangle"+i, ce qui me donne un
en changeant par "rectangle"+string(i), j'ai une autre erreur :
Bonjour,
J'ai fini par trouver comment m'y prendre : j'ai créé un vecteur contenant le nom des rectangles, il m'est par la suite possible d'utiliser ta méthode en entrant getChildByName(vecteur[i]).
Merci pour le coup de main !
Joyeuses fêtes.