Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS3
AS3 Questions relatives à la programmation ActionScript 3 (Cours AS3)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/09/2007, 17h03   #1
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
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...
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 18h29   #2
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
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 ?
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2007, 10h54   #3
Membre actif
 
Inscription : avril 2007
Messages : 126
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2007
Messages : 126
Points : 150
Points : 150
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é
David Buff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2007, 11h12   #4
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
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.
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2007, 11h54   #5
Membre actif
 
Inscription : avril 2007
Messages : 126
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2007
Messages : 126
Points : 150
Points : 150
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 :
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 :
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?
David Buff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2007, 12h03   #6
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
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+
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2007, 16h07   #7
Membre actif
 
Inscription : avril 2007
Messages : 126
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2007
Messages : 126
Points : 150
Points : 150
Ca a été et ce sera avec plaisir !
David Buff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 23h08   #8
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
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 :
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.
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h51.


 
 
 
 
Partenaires

Hébergement Web