Bonjour tout le monde !!!
J'ai un petit probleme...
J'ai réalisé une gallerie dynamique, entièrement gérée par du code. Je charge les images via une base de données XML. Il s'agit d'une galerie défilante avec deux boutons qui font coulisser les images d'un cran vers la gauche ou la droite par clic. Voici le code :
*****************************************************************************************
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.*;
import flash.display.Loader;
var mesImages:XMLList;
var my_total:Number;
var hauteurImage:Number;
var largeurImage:Number;
var buttoirGauche:Number;
var buttoirDroite:Number;
var tableauLegendes:Array = [];
var conteneurLegende: MovieClip = new MovieClip();
var my_playback_counter: Number = 0;
var chargeurURL: URLLoader = new URLLoader();
chargeurURL.load(new URLRequest("galerie.xml"));
chargeurURL.addEventListener(Event.COMPLETE, chargeXML);
var scene:MovieClip;
var boutongauche:boutonGauche = new boutonGauche;
boutongauche.x=30;
boutongauche.y=stage.stageHeight/2;
var boutondroite:boutonDroite = new boutonDroite;
boutondroite.x=stage.stageWidth-30;
boutondroite.y=stage.stageHeight/2;
boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche);
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite);
function chargeXML(e:Event):void
{
var myXML:XML = new XML(e.target.data)
mesImages = myXML.IMAGE;
hauteurImage = myXML.@HEIGHT;
largeurImage = myXML.@WIDTH;
my_total = mesImages.length();
creeScene();
apelleImages();
}
function creeScene():void
{
scene = new MovieClip();
addChildAt(scene,0);
addChildAt(boutongauche,1);
addChildAt(boutondroite,1);
}
function apelleImages():void
{
for (var i:Number = 0; i < my_total; i++)
{
var URLImages = mesImages
.@URL;
var chargeurImages = new Loader();
chargeurImages.load(new URLRequest(URLImages));
chargeurImages.contentLoaderInfo.addEventListener( Event.COMPLETE, imagesChargees);
chargeurImages.x = ((stage.stageWidth-largeurImage)/2)+((largeurImage+50)*i);
chargeurImages.y = (stage.stageHeight-hauteurImage)/2;
var legende:TextField = new TextField();
var myFormat:TextFormat = new TextFormat();
var myFont = new Font1();
myFormat.size = 15;
myFormat.font = myFont.fontName;
legende.defaultTextFormat = myFormat;
legende.embedFonts = true;
legende.antiAliasType = AntiAliasType.ADVANCED;
legende.textColor = 0xFFFFFF;
legende.text =mesImages[i].@TITLE;
legende.width= 400;
legende.height= 100;
legende.wordWrap = true;
legende.x = chargeurImages.x+5;
legende.y = ((stage.stageHeight+hauteurImage)/2)+10;
scene.addChild(legende);
legende.name ="legende"+i;
legende.addEventListener(Event.ENTER_FRAME, modifieLegende);
}
}
function modifieLegende (e:Event):void
{
if(((scene.x + e.target.x)>=294)&&((scene.x + e.target.x)<=494))
{e.target.alpha=1;
} else {
e.target.alpha = 0;
}
}
function imagesChargees(e:Event):void
{
var monImage:Loader = Loader(e.target.loader);
scene.addChild(monImage);
}
function glisseGauche (e:MouseEvent):void
{
buttoirGauche =-((my_total*450)-(stage.stageWidth/2));
if(scene.x>buttoirGauche){
var myTweenGauche:Tween = new Tween(scene, "x", Strong.easeOut, scene.x, (scene.x-(largeurImage+50)), 1, true);
boutongauche.removeEventListener(MouseEvent.CLICK, glisseGauche);
}else{
scene.stop();
}
myTweenGauche.addEventListener(TweenEvent.MOTION_F INISH, onFinishGauche);
}
function onFinishGauche(e:TweenEvent):void
{
boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche);
}
function glisseDroite (e:MouseEvent):void
{
buttoirDroite =0;
if(scene.x<buttoirDroite)
{var myTweenDroite:Tween = new Tween(scene, "x", Strong.easeOut, scene.x, (scene.x+(largeurImage+50)), 1, true);
boutondroite.removeEventListener(MouseEvent.CLICK, glisseDroite);
}else{
scene.stop();
}
myTweenDroite.addEventListener(TweenEvent.MOTION_F INISH, onFinishDroite);
}
function onFinishDroite(e:TweenEvent):void
{
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite);
}
*****************************************************************************************
Tout fonctionne très bien au début, mais si on reste longtemps sur la gallerie ou qu'on s'amuse à aller et venir d'un bout à l'autre de celle-ci l'affichage ralentit de plus en plus jusqu'à se bloquer totalement !
Je pense que le probleme vient du code permettant d'afficher les légendes elles aussi importées via XML. Il y a un texte associé à chaque image qui s'affiche lorsque le jpeg correspondant se trouve au centre de l'écran... En gros j'ai affecté un écouteur à chaque image chargée[i](legende.addEventListener(Event.ENTER_FRAME, modifieLegende);): à chaque ENTER_FRAME il lance la fonction modifieLegende qui modifie l'alpha de chaque texte...
Or ENTER_FRAME est, si j'ai bien compris, un événement qui est lancé en boucle tout le temps que l'on est sur la frame. Ce qui expliquerait que la mémoire soit toujours plus saturée avec le passage du temps.
J'ai pensé affecter mon écouteur aux boutons plutôt qu'aux images, ce qui m'autoriserait à lancer l'écouteur lors des clics et à le supprimer quand le mouvement est effectué, mais je ne peux pas établir de lien entre les boutons et les variables crées à l'intérieur de la fonction apelleImages...
Quelqu'un saurait-il comment faire référence à une variable crée à l'intérieur d'une fonction ?
Ou quelque autre solution qui me permettrai de rendre le swf efficace ???
J'espère que j'ai été assez clair... merci mille fois si vous avez eu le courage de lire jusqu'ici !!!!! ;)