begin process at 2012 05 27 12:31:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Flash / Flash MX

 > 

Base de données

 > 

XML

 > 

Poid d'un SWF et boucles


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Poid d'un SWF et boucles

dimanche 25 septembre 2011 à 01:15:52 | Poid d'un SWF et boucles

LinklOurs

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 !!!!! ;)
lundi 26 septembre 2011 à 12:37:47 | Re : Poid d'un SWF et boucles

aerolyte

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


Code ActionScript :
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
jeudi 6 octobre 2011 à 19:27:30 | Re : Poid d'un SWF et boucles

LinklOurs

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...
vendredi 7 octobre 2011 à 10:09:04 | Re : Poid d'un SWF et boucles

aerolyte

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
vendredi 7 octobre 2011 à 11:34:53 | Re : Poid d'un SWF et boucles

LinklOurs

Le problème vient bien des tween ! Il faut déclarer la variable tween avant d'y ajouter un écouteur !! Merci pour ton aide !!


Cette discussion est classée dans : var, scene, import, boutongauche, boutondroite


Répondre à ce message

Sujets en rapport avec ce message

galerie papervision [ par bretagne22 ] Je viens de réaliser une galerie d'images avec PV3D et AS3.Tout fonctionne bien sauf...Je n'arrive pas à rendre mes plane interactives. Je voudrais qu plantage PHPMyAdmin par AS3 [ par leroidelesprit ] Bonjour, J'ai quelques soucis persistants avec une interaction que j'essaie d'implanter dans une page html:Il s'agit d'un site de généalogie...Mon idé Erreur de fonction dans une classe [ par on_drag_on ] Bonjour à tous,Je suis entrain de créer une classe pour un lecteur vidéo avec chargement XML. Jusque-là tout fonctionne. Maintenant j'ai créé un clip Zoom sur clic avec centrage auto [ par aZents ] Bonjour à tous, depuis quelque temps j'essaie de trouver solution à mon problème mais bon mon niveau est comment dirais-je....(en dessous de débutant Ajout d'un élément fixe sur diaporama en AS3 [ par alxrb ] Hello, j'ai suivi un tuto en AS3 pour créer un diaporama avec fondu et déplacement sur y. Tout fonctionne, sauf que je voudrais placer un logo sur la petit coup de main sur un action script [ par pdavid1985 ] Bonjour,Voila j'ai trouvé un code sur ce site qui vise à créer une bannière flash pour afficher des images défilantes et qui fait appel pour ça à un x un carré simple en AS3 ne s'affiche pas - pourquoi?? heck!! [ par tim2 ] Je n'avais pas touché à Flash depuis AS2; je ne comprends plus rien..! J'essaie de créer dynamiquement un carré - la fonction est bien appelée et je p Problemes avec lecteur MP3 sous flash CS4/AS3 [ par nicolasp31000 ] Bonjour à tous Je débute dans la programmation sous AS3 et j'essaye actuellement de créer un petit contrôleur(bouton play et bouton pause) pour pouvoi AcrionScript 3 Lecture d'un fichier XML [ par nuns ] Bonjour, J'essaie de faire une classe pour charger un fichier xml, qui comporte juste le chemin des images sur le serveur. La lecture ce fait correc Bannière AS3, import d'images via un XML...Problème de boucle [ par szekes ] Bonjours à tous, voilà je suis nouveau sur ce forum et je débute aussi en AS3... Autant dire que je n'y comprend pas grand chose encore...Mais sa va v


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,856 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales