IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Accéder à des méthodes d'une classe Main appartenant à un swf chargé


Sujet :

ActionScript 3

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Accéder à des méthodes d'une classe Main appartenant à un swf chargé
    Bonjour,

    Pas évident à expliquer, je vais essayer d'être le plus clair possible. Si vous comprenez et que vous avez une solution, je ne sais pas ce que je vous fait, mais...

    Cela concerne Flash 9, et l'AS3.

    J'ai un fichier principal.swf, et son code se trouve dans un fichier Main.as (Main.as est indiqué dans le champ "classe du document")

    Ce fichier comporte un textField sur la scène appelé statut. Il comporte également le composant UILoader.

    J'ai un deuxième fichier second.swf, avec son fichier Main.as également.

    Dans le UILoader de mon fichier principal.swf, je charge le fichier second.swf

    Jusque là, tout est ok. Vous arrivez toujours à suivre ? Bon, et bien c'est presque finit.

    J'aimerais interragir entre les 2 fichiers. Par exemple, depuis une méthode de la classe Main du fichier second.swf (qui est chargé dans le fichier principal, je rappelle), j'aimerais écrire "Houra, ça marche !!" dans le textField statut du fichier principal.swf.

    Bien sûr, ça ne fonctionne pas. Car en compilant mon fichier second, le compilateur indique une erreur parce que statut est inconnu. Et pour cause, il est dans le fichier principal.

    J'ai essayé pleins de truc, sans sucès. Qui aurait une piste à me donner ?
    Peut-être n'est tout simplement pas possible ?

    En tout cas, merci à ceux qui auront le courage de me répondre.

    A++

    PS. j'ai vu ce topic intéressant :

    http://www.developpez.net/forums/sho...d.php?t=410635

    Mais moi, ce n'est pas l'animation parent qui doit exécuter une méthode sur l'animation chargée, mais l'inverse...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Bon, j'ai peut-être trouvé, mais il y a peut-être plus simple ?

    Puisque j'arrive à communiquer dans le sens parent.swf vers fichierChargé.swf (bravo à David Buff, cf. le lien dans mon précédent post), alors j'exécute une méthode du fichier chargé en lui passant en argument this.

    J'obtiens alors dans mon fichier chargé une référence à l'animation parent. Je peux ainsi exécuter toutes les méthodes publiques et récupérer les différentes propriétés publiques de l'animation parent, via maRessource.meMethode();



    Mais peut-être existe t-il une syntaxe permettant de pointer directement dans le fichier parent qui procède au chargement ?

  3. #3
    Membre habitué
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Points : 174
    Points
    174
    Par défaut
    Merci pour les compliments

    Lorsque le SWFLoader charge le SWFLoadé, le premier contient une référence au second (le loader). Mais le second ne peut pas connaître le premier, à moins que dans son constructeur, il récupère la bonne référence par le biais de parent ou stage et la caste avec le type de la classe document de SWFLoader.

    C'est l'inverse de ce que j'explique à propos du cast de DisplayObject.content. De la même manière, la référence qui est faite à SWFLoader dans SWFLoadé doit être castée correctement, sous peine de ne pas pouvoir accéder à ses méthodes.

    Ton astuce de passer this est plutôt une bonne idée.

    Si tu veux, envoie le code de tes deux classes document, on regardera si ça peut être plus propre et simplifié

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Bonjour David,

    Alors, je ne peux pas envoyer le contenu de mes classes, parce que si tu voyais le bordel (je dois tout finir pour demain !! Il faut que ça marche demain, peu importe la forme, j'y retravaillerai dans la semaine...)

    Du coup, je garde mon principe de passer this en référence, puisque ça fonctionne.

    Mais ce que tu expliques me parait plus "classe" (jeu de mots à 2 balles ).

    Peux-tu m'en dire un peu plus ? Je comprenais le passage du Loader au loadé, mais je n'arrive pas à comprendre le chemin inverse. Parce que on a effectivement le loader, comme point d'entrée au loadé, mais dans l'autre sens ?

    Je ne suis pas arrivé à appliquer ta méthode dans l'autre sens hier, en essayant par tous les moyens.

  5. #5
    Membre habitué
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Points : 174
    Points
    174
    Par défaut
    Le plus propre est sûrement de faire comme tu l'avais fait, avec un passage de référence. Si tu passes par le stage ou parent, ça suppose que tu aies fait un addchild(), c'est à dire que ce soit un objet graphique, et que tu l'aies posé sur le stage. Sinon, s'il n'a pas été posé dans la pile graphique, tu ne peux faire aucune référence à lui via le stage ou parent.

    Donc dans l'éventualité où tu ne l'as pas posé, ou que tu veux le poser plus tard, d'un point de vue généraliste donc, il vaut mieux effectivement lui passer une référence.

    Voilà un exemple de la classe document qui est chargé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package {
     
    	import flash.display.MovieClip;
     
    	public class MainLoaded extends MovieClip {
     
    		public var mcLoader:MainLoader;
     
    		public function MainLoaded() {
    			trace("MainLoaded créé");
    		} // end constructor
     
    		public function init(aLoader:MainLoader):void {
    			mcLoader = aLoader;
    			mcLoader.loaderTest();
    		} // end init
     
    		public function loadedTest():void {
    			trace("Test d'appel de méthode de loaded");
    		} // end loadedTest
     
    	} // end class
    } // end package
    et un exemple de la classe document qui charge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package {
     
    	import flash.display.MovieClip;
    	import flash.events.Event;
    	import flash.net.URLRequest;
    	import flash.display.Loader;
     
    	public class MainLoader extends MovieClip {
     
    		public var mcLoaded:MainLoaded;
     
    		public function MainLoader() {
    			trace("MainLoader créé");
    			var loader:Loader = new Loader();
    			loader.contentLoaderInfo.addEventListener("complete", clipOnLoad);
    			loader.load(new URLRequest("SWFMainLoaded.swf"));
    		} // end constructor
     
    		public function clipOnLoad(aEvent:Event):void {
    			trace("MainLoaded chargé");
    			mcLoaded = MainLoaded(aEvent.target.content);
    			mcLoaded.init(this);
    			mcLoaded.loadedTest();
    		} // end clipOnLoad
     
    		public function loaderTest():void {
    			trace("Test d'appel de méthode de loader");
    		} // end loaderTest
     
    	} // end class
    } // end package
    Ici, chacun des objet appelle une méthode de l'autre pour vérifier que la référence est juste. Tu noteras le cast des pointeur mcLoaded et mcLoader au passage.

    C'est plus clair comme ça?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Alors, oui, c'est plus clair. Tu ne t'ai pas contenté de fournir une explication, tu as directement créé un exemple, alors que demander de plus ?

    Je me plongerai dans tout ça cette semaine, pour améliorer le bouzin que je suis en train de pondre.

    Euh, tu bosses chez Adobe ou quoi ? En tout cas, tu m'as l'air hyper compétent sur l'AS3. Aussi compétent que disponible pour répondre aux autres avec autant de péricision.

    1000 mercis à toi et qui sait, peut-être que j'aurai la chance de pouvoir te filer un coup de main quand c'est toi qui sera dans la demande (encore que je doute bien pouvoir y répondre, dans ce cas !)

    A+

  7. #7
    Membre habitué
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Points : 174
    Points
    174
    Par défaut
    Ca a été et ce sera avec plaisir !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    Voilà que je reviens sur ce post pour faire part d'une nouvelle découverte, permettant d'arriver aux mêmes buts avec un peu plus de simplicité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.loaderInfo.loader.parent
    Ceci permet , depuis la classe Main du fichier chargé, de cibler l'objet Main initial (celui à l'initiative du Loader), et d'y exécuter les méthodes associées.

Discussions similaires

  1. [XL-2003] Création des méthodes d'une classe personnalisée
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/07/2010, 20h32
  2. Accéder aux méthodes d'une classe
    Par doubiste_59 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 28/07/2010, 16h09
  3. Réponses: 4
    Dernier message: 22/09/2008, 15h33
  4. Réponses: 14
    Dernier message: 08/04/2008, 16h42
  5. Réponses: 5
    Dernier message: 23/04/2007, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo