Aller au contenu

AS3 fonction event, comment reccupérer une variable d'une fonction précédente?


Sujets conseillés

Posté (modifié)

Bonjour a tous !

Je me permet de venir m'éclairer de vos lumières .

Pour commencer je vais vous expliquer ce que je veux réaliser . Je tente de faire un programme flash AS3 qui me permet de charger des images a partir d'un fichier XML, et de redimensionner et placer celles ci de manière homogène sur ma scene .

J'utilise une fonction de type Event:Complete pour charger mon ficher XML . Par la suite, dans cette fonction j'appelle une autre fonction du meme type pour charger mes images . Le problème se trouve a ce moment là , je n'arrive pas a récupérer les variables de la fonction "parente" .

Explication par la code :


import flash.events.Event;
stop();

var Hauteur:Number = 90 ;
var Largeur:Number = 90 ;

var option_url:String = loaderInfo.parameters.option ; // récupère l'url du fichier XML par la variable placé dans le code HTML
var loader_XML:URLLoader = new URLLoader(); // créé un nouveau loader URL
loader_XML.addEventListener(Event.COMPLETE,LOAD_BIBLIO_COMPLETE); // Ecoute d'un évènement COMPLETE par le loader
loader_XML.load(new URLRequest(option_url))// Chargement d'un fichier dans le loader par une URL

function LOAD_BIBLIO_COMPLETE(charge_bib:Event):void // Fonction evenementiel utilisé lors d'un retour COMPLETE
{
charge_bib.target.removeEventListener(Event.COMPLETE, LOAD_BIBLIO_COMPLETE ); // Suppression de l'écouteur
var xml:XML = new XML(charge_bib.target.data); // variable XML = charge le type xml du fichier renvoyé par loader_XML
for(var i=0;i < xml.image.length(); i++) // boucle listant tout le contenu des balise contenu dans le fichier XML
{
CREATE_IMG(xml.image[i].cible,i); // Appel la fonction qui créé un nouveau loader (d'image)
}
}
function LOAD_IMG_COMPLETE(charge_img:Event):void // Fonction evenementiel utilisé lors d'un retour COMPLETE
{
charge_img.target.removeEventListener(Event.COMPLETE, LOAD_IMG_COMPLETE );// suppression de l'écouteur
charge_img.target.width=Largeur; // (edit...)
charge_img.target.height=Hauteur; // (edit...)
// ICI j'aimerai charger la variable $i de la fonction parente.
}

var CREATE_IMG = function($src:String,$i:Number) // création d'une fonction permetant la création d'un nouveau loader
{
var loader_IMG:Loader = new Loader ();
loader_IMG.contentLoaderInfo.addEventListener(Event.COMPLETE,LOAD_IMG_COMPLETE); // Ecoute si l'image est chargé completement
loader_IMG.load(new URLRequest($src))// créé une requette URL vers le fichier listé
loader_IMG.name="Num"+$i;
}

Je ne sais pas si je suis bien claire et si mon code est "propre" :wacko: lol . En tous cas , j'espère que ce sera assez compréhensible et que vous pourrez m'aider a mieux comprendre AS3 .

si quelqu'un a une meilleur méthode et plus simple , je suis preneur . Merci beaucoup ;)

Modifié par raph37
Posté (modifié)

J'ai trouvé une façon d'arriver à mes fins et aussi j'ai simplifié le code .

ce script n'affiche pas les images dans l'ordre du fichier xml , mais du fichier (image) chargé du plus vite au moins vite. Il redimensionne et place les image a égale distance .

Si vous trouvez que mon code est nulle ou que mes commentaires sont a coté de la plaque, n'hésitez pas a me le dire ou a m'aider a le modifier ;) merci .

la prochaine étape sera d'afficher les images dans l'ordre du fichier xml ;)


import flash.events.Event;
stop();

var Hauteur:Number = 100 ;
var Largeur:Number = 100 ;
var espace:Number = 10 ;
var distance:Number = 0 ;

var option_url:String = loaderInfo.parameters.option ; // récupère l'url du fichier XML par la variable placé dans le code HTML
var loader_XML:URLLoader = new URLLoader(); // créé un nouveau loader URL
loader_XML.addEventListener(Event.COMPLETE,LOAD_BIBLIO_COMPLETE); // Ecoute d'un évènement COMPLETE par le loader
loader_XML.load(new URLRequest(option_url))// Chargement d'un fichier dans le loader par une URL

var str_replace = function(original:String,old:String,now:String):String
{
return (original.split(old)).join(now);
}
function LOAD_BIBLIO_COMPLETE(charge_bib:Event):void // Fonction evenementiel utilisé lors d'un retour COMPLETE
{
charge_bib.target.removeEventListener(Event.COMPLETE, LOAD_BIBLIO_COMPLETE ); // Suppression de l'écouteur
var xml:XML = new XML(charge_bib.target.data); // variable XML = charge le type xml du fichier renvoyé par loader_XML

for(var i=0;i < xml.image.length(); i++) // boucle listant tout le contenu des balise contenu dans le fichier XML
{
var loader_IMG:Loader = new Loader ();
loader_IMG.name="Num"+i;
loader_IMG.contentLoaderInfo.addEventListener(Event.COMPLETE,LOAD_IMG_COMPLETE); // Ecoute si l'image est chargé completement
loader_IMG.load(new URLRequest(xml.image[i].cible))// créé une requette URL vers le fichier listé
}
}
function LOAD_IMG_COMPLETE(charge_img:Event):void // Fonction evenementiel utilisé lors d'un retour COMPLETE
{
charge_img.target.removeEventListener(Event.COMPLETE, LOAD_IMG_COMPLETE );// suppression de l'écouteur
var $i:Number = str_replace(charge_img.target.loader.name,"Num",""); // retrouve le numéro de l'image par une fonction str_replace

var proportion:Number = charge_img.target.height / Hauteur; // variable du facteur proportionnel
var Largeur:Number = charge_img.target.loader.width / proportion; // variable de la largeur proportionnel
charge_img.target.content.width=Largeur; // redimensionnement de la largeur du loader
charge_img.target.content.height=Hauteur; // redimensionnement de la hauteur du loader

addChild(charge_img.target.loader); // ajoute le loader sur la scène

charge_img.target.loader.content.x=distance; // placement du loader sur l'axe x = a la variable distance qui s'implémente a chaque images
distance = distance + espace + Largeur; // la variable distance additionne sa valeur précédente avec l'espace et la largeur pour placer la prochaine image plus loin.
}

Modifié par raph37
Posté

Bon ok je suis un boulet ! surtout que c'est les bases ... :wacko:

il suffisait de la déclarer a l'extérieur des fonctions , ainsi la valeur peut être récupérée de n'importe ou ... :whistling:

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...