Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Le global en AS3

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.Par ekameleon (Marc Alcaraz)

Comme nous pouvons le voir sur la page ActionScript 2.0 Migration du livedocs de macromedia(Adobe), l'objet _global est supprimé dans le framework natif AS3. La grande nouveauté (par rapport à l'AS2) vient du fait qu'il est possible de coder à l'extérieur des packages et des classes dans un fichier .as. Il est possible de déclarer des variables globales un peu partout dans les fichiers AS3.

En AS2 nous étions obligé d'utiliser un “hack” pour lancer des actions globales avec le mot clé static, exemple :

// Code AS2____
 
class MyClass {
 
    // ----o Constructor
 
    function MyClass() {}
 
    // ----o Init Broadcaster
 
   static public var INITBroadcaster = AsBroadCaster.initialize(MyClass.prototype) ;
 
 
}

Il est maintenant possible de coder directement dans le ficher sans utiliser de variable static, un peu comme sur la timeline de Flash. Au final nous sommes plus proche du SSAS que de l'AS2 dans les fichiers AS3. Le seul truc c'est qu'il est possible à tout moment de déclarer des classes et des packages en plein milieu ! J'espère vraiment que la prochaine version de Flash Media Server suivra cette nouvelle norme ECMAScript en orientant le SSAS vers de l'AS3 ou du Javascript 2 !

Maintenant, après la joie de cette nouvelle découverte, une question se pose ?? Comment accéder facilement au scope global en AS3 ?

Il est évident que tout ce que l'on déclare hors d'une classe devient global … mais comment ensuite énumérer par exemple tout ce qui est contenu dans le scope global ? Ou comment faire pour dynamiquement ajouter des propriétés sur cet objet ?

Sur le coup j'ai eu un gros stress… en essayant un peu dans tous les sens des bouts de code pour retrouver le “global” AS3. Il semblait alors impossible de cibler le global en AS3 ? Je me suis soudain senti mal à l'aise… Je ne pouvais pas imaginer un langage basé ECMAScript n'ayant aucune référence de l'objet global !

Heureusement, c'était sans compter sur une petite discussion avec Zwetan sur GoogleTalk et quelques liens envoyés par celui ci au sujet de l'AS3 comme celui ci : AS3 programming 101 for C/C++ coders

Au final aprés un déblocage de la situation par Zwetan et quelques tests …. il est possible d'accéder facilement au scope global de l'application en AS3 ! En fait, La réponse était évidante, identique en gros à ce que l'on peut faire en SSAS… il suffisait juste de bien cerner l'utilisation des variables globales en AS3 !

Solution

package {
 
     import flash.display.Sprite;
     import flash.utils.trace ;
 
     public class MainClass extends Sprite
     {
 
            // ----o Constructor
 
	    public function MainClass() {
 
                trace(">> _global : " + _global) ;
                trace(">> myGlobalProperty : " + _global.myGlobalProperty) ;           
            }
 
   	}
 
 
}
 
if (_global == null ) {
    var _global = this ;
}
 
_global.myGlobalProperty = "hello world" ;
 
trace(">>> myGlobalProperty in global namespace" + _global.myGlobalProperty) ;

Nous pouvons donc coder directement un objet _global dans les fichiers source AS3, un peu comme sur une timeline dans Flash avec le _root. Avec cette méthode, nous conservons la souplesse du SSAS et la robustesse d'un langage basé sur des classes.

Au final, j'opte pour la déclaration de cet objet _global via un include lorsque j'en ai vraiment besoin.

EKAMELEON - ALCARAZ Marc (2006). Vous pouvez consulter ce tutorial et des commentaires sur mon blog.