Poid d'un SWF et boucles

LinklOurs Messages postés 6 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 7 octobre 2011 - 25 sept. 2011 à 01:15
LinklOurs Messages postés 6 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 7 octobre 2011 - 7 oct. 2011 à 11:34
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[i].@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(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 !!!!! ;)

4 réponses

aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
26 sept. 2011 à 12:37
Bonjour voici quelques correction te reste qu'a comprendre tout ca et surtout a essayer de yrouver la solution pour gérer l'alpha des tes legendes


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:int;//mauvais typage
var hauteurImage:Number; 
var largeurImage:Number; 
var buttoirGauche:Number; 
var tableauLegendes:Array=[]; 
var conteneurLegende:MovieClip=new MovieClip(); 
var my_playback_counter:Number=0; 

var scene:MovieClip; 
var boutongauche:boutonGauche=new boutonGauche();// manque les parenthéses
var boutondroite:boutonDroite=new boutonDroite();//manque les parenthèses

// chargement en dernier sinon tu cours  a l'erreur, car dans le principe si ton chargement est fini mais que tu as pas tout instancier ton programme risque de planter
var chargeurURL:URLLoader=new URLLoader(); 
chargeurURL.addEventListener(Event.COMPLETE, chargeXML);
//il faut lancer le chargement après avoir poser l'ecouteur
chargeurURL.load(new URLRequest("galerie.xml")); 

function chargeXML(e:Event):void{
// il faut penser a supprimer les ecouteurs
e.target.removeEventListener(Event.COMPLETE,chargeXML);
// j'ai des doutes quant a l'élaboration de ton xml
var myXML:XML=new XML(e.target.data) 
mesImages=myXML.IMAGE; 
hauteurImage=myXML.@HEIGHT; 
largeurImage=myXML.@WIDTH; 
my_total=mesImages.length(); 
//creeScene(); inutile met le dans ma meme function
initialisation();
} 

function initialisation():void{
scene=new MovieClip();
boutongauche.x=30;
boutondroite.x=stage.stageWidth-30; 
boutongauche.y=boutondroite.y=stage.stageHeight/2; 
addChildAt(scene,0); 
addChildAt(boutongauche,1); 
addChildAt(boutondroite,1);
// applique tes ecouteurs uniquement lorsque ta scene est prete
boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche); 
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite);

// alors la tu  as déja un gros pb tu blindes une boucle de plein de chose complétemet inutile
var URLImages:String;
var chargeurImages:Loader;
var legende:TextField;
var myFormat:TextFormat=new TextFormat(); 
var myFont=new Font1(); 
myFormat.size=15; 
myFormat.font=myFont.fontName; 

// au lieu de recalculer a chaque fois le stage, faut le faire avant la boucle
var stageH:Number=stage.stageHeight;
var stageL:Number=stage.stageWidth;
//"i" doit etre typé int c'est un entier
for(var i:int=0;i my_total;i++){ 
URLImages=mesImages.@URL; 
chargeurImages=new Loader();
chargeurImages.x=((stageL-largeurImage)/2)+((largeurImage+50)*i); 
chargeurImages.y=(stageH-hauteurImage)/2;
scene.addChild(chargeurImages);//remplace ce que tu as mis dans ton écouteur
 
 // il faut essayer  d'etre logique dans les declarations de propriétés
legende=new TextField();
legende.name ="legende"+i; 
legende.defaultTextFormat=myFormat; 
legende.embedFonts=true;
legende.wordWrap=true;
legende.antiAliasType = AntiAliasType.ADVANCED; 
legende.textColor=0xFFFFFF;
legende.x=chargeurImages.x+5; 
legende.y=((stageH+hauteurImage)/2)+10;
legende.width=400; 
legende.height=100; 
legende.text=mesImages[i].@TITLE; 
scene.addChild(legende);

chargeurImages.load(new URLRequest(URLImages));

//legende.addEventListener(Event.ENTER_FRAME, modifieLegende); oublie tout de suite
//il faut que tu géres ton changment d'alpha de légende a partir des tween que tu utilise deja
//en particulier sur tes onFinish, mais je te laissse chercher
} 
}


function glisseGauche(e:MouseEvent):void{ 
buttoirGauche=-((my_total*450)-(stage.stageWidth/2)); 
if(scene.x>buttoirGauche){
//on supprime les ecouteur en premier pour eviter tout conflit
boutongauche.removeEventListener(MouseEvent.CLICK, glisseGauche);
//ecouteur avant le tween
myTweenGauche.addEventListener(TweenEvent.MOTION_FINISH, onFinishGauche);// une erreur :un espace en trop
var myTweenGauche:Tween=new Tween(scene,"x",Strong.easeOut,scene.x,(scene.x-(largeurImage+50)),1,true); 
}else{ 
scene.stop(); 
} 
} 
function onFinishGauche(e:TweenEvent):void{
//il faut penser à supprimer les ecouteurs
e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishGauche)
boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche); 
} 


function glisseDroite(e:MouseEvent):void{ 
if(scene.x<0){
//idem
boutondroite.removeEventListener(MouseEvent.CLICK, glisseDroite);
myTweenDroite.addEventListener(TweenEvent.MOTION_FINISH, onFinishDroite);// une erreur :un espace en trop
var myTweenDroite:Tween=new Tween(scene,"x",Strong.easeOut,scene.x,(scene.x+(largeurImage+50)),1,true); 
}else{ 
scene.stop(); 
} 
} 

function onFinishDroite(e:TweenEvent):void{
//il faut penser à supprimer les ecouteurs
e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishDroite)
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite); 
}


Cordialement
0
LinklOurs Messages postés 6 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 7 octobre 2011
6 oct. 2011 à 19:27
Salut Aerolyte !
Merci infiniment de ta réponse ! Tu as bien raccourci l'ensemble du code !!! Je comprend mieux le code !
J'ai apporté toutes les modifications dont tu m'as parlé, le swf se lance bien, mais lorsque je clique sur l'un des deux boutons ka fenêtre d'erreur m'affiche "TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul. at galerie3bis_fla::MainTimeline/glisseGauche()".
J'ai bien sûr tenté de comprendre d'où vient l'erreur. Peut-être est le fait que l'on ajoute les objets boutongauche, boutondroite et scene dans la fonction initialisation...

J'ai donc tenté d'instancier ces objets en dehors de la dite fonction, comme suit :


_________________________________________________________________________________________


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;
import flash.text.TextField;

var mesImages:XMLList;
var my_total:int;
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 scene:MovieClip;
var boutongauche:boutonGauche = new boutonGauche();
var boutondroite:boutonDroite = new boutonDroite();

var chargeurURL: URLLoader = new URLLoader();
chargeurURL.addEventListener(Event.COMPLETE, chargeXML);
chargeurURL.load(new URLRequest("galerie.xml"));

scene = new MovieClip();
boutongauche.x=30;
boutondroite.x=stage.stageWidth-30;
boutongauche.y=boutondroite.y=stage.stageHeight/2;
addChildAt(scene,0);
addChildAt(boutongauche,1);
addChildAt(boutondroite,1);

boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche);
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite);


function chargeXML(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE,chargeXML);

var myXML:XML = new XML(e.target.data)
mesImages = myXML.IMAGE;
hauteurImage = myXML.@HEIGHT;
largeurImage = myXML.@WIDTH;
my_total = mesImages.length();

initialisation();
}

function initialisation():void{

var URLImages:String;
var chargeurImages:Loader;
var legende:TextField;
var myFormat:TextFormat = new TextFormat();
var myFont = new Font1();
myFormat.size = 15;
myFormat.font = myFont.fontName;

var stageH:Number=stage.stageHeight;
var stageL:Number=stage.stageWidth;

for (var i:Number = 0; i < my_total; i++)
{
URLImages = mesImages[i].@URL;
chargeurImages = new Loader();
chargeurImages.x = ((stageL-largeurImage)/2)+((largeurImage+50)*i);
chargeurImages.y = (stageH-hauteurImage)/2;
//chargeurImages.contentLoaderInfo.addEventListener(Event.COMPLETE, imagesChargees);
scene.addChild(chargeurImages);

legende = new TextField();
legende.name ="legende"+i;
legende.defaultTextFormat = myFormat;
legende.embedFonts = true;
legende.wordWrap = true;
legende.antiAliasType = AntiAliasType.ADVANCED;
legende.textColor = 0xFFFFFF;
legende.x = chargeurImages.x+5;
legende.y = ((stageH+hauteurImage)/2)+10;
legende.width= 400;
legende.height= 100;
legende.text =mesImages[i].@TITLE;
//legende.addEventListener(Event.ENTER_FRAME, modifieLegende);
scene.addChild(legende);

chargeurImages.load(new URLRequest(URLImages));
}
}


/*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 glisseGauche (e:MouseEvent):void
{
buttoirGauche =-((my_total*450)-(stage.stageWidth/2));
if(scene.x>buttoirGauche){
boutongauche.removeEventListener(MouseEvent.CLICK, glisseGauche);
myTweenGauche.addEventListener(TweenEvent.MOTION_FINISH, onFinishGauche);
var myTweenGauche:Tween = new Tween(scene, "x", Strong.easeOut, scene.x, (scene.x-(largeurImage+50)), 1, true);
}else{
scene.stop();
}
}

function onFinishGauche(e:TweenEvent):void
{
e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishGauche);
boutongauche.addEventListener(MouseEvent.CLICK, glisseGauche);
}


function glisseDroite (e:MouseEvent):void
{
buttoirDroite =0;
if(scene.x<buttoirDroite)
{
boutondroite.removeEventListener(MouseEvent.CLICK, glisseDroite);
myTweenDroite.addEventListener(TweenEvent.MOTION_FINISH, onFinishDroite);
var myTweenDroite:Tween = new Tween(scene, "x", Strong.easeOut, scene.x, (scene.x+(largeurImage+50)), 1, true);
}else{
scene.stop();
}
}

function onFinishDroite(e:TweenEvent):void
{
e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishDroite);
boutondroite.addEventListener(MouseEvent.CLICK, glisseDroite);
}


_________________________________________________________________________________________


Mais l'erreur reste toujours la même... je ne vois vraiment pas ce dont il retourne...
0
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
7 oct. 2011 à 10:09
Bonjour, avec le code que j'ai posté met tes twen en commentaire avec "//"
et fait un test., car je ne vois que la ou un un obect est pas déclarér.
Et comme je me rappelle plus de mémoire la déclaration de tween je ne peux t'en dire plus
0
LinklOurs Messages postés 6 Date d'inscription mardi 27 avril 2010 Statut Membre Dernière intervention 7 octobre 2011
7 oct. 2011 à 11:34
Le problème vient bien des tween ! Il faut déclarer la variable tween avant d'y ajouter un écouteur !! Merci pour ton aide !!
0