Salut, j'ai l'habitude des animations flash non dynamiques je suis designer mais je suis un codeur as3 débutant :
je dois faire dans le cadre d'une animation dynamique, se succéder avec le même mouvement (dans un masque rectangulaire) un max de 18 images contenant 3 variables, issues d'un xml :
• url de l'image à afficher
• la légende de l'image
• un lien si on clique cette image
celui-ci est du type :
slideshow.xml
<data>
<maselection monimage="viewProductImage.jpg" malegende="Canapé 2 places ATTITUDE" monlien="http://www.unlien.com" />
etc...jusqu'a max 18 "maselecion"
</data>
je ne programme pas (pour l'instant, mais j'y viendrai) en orienté objet, et mon code doit être très crado et pas très sain j'en conviens...
sans boucle, lorsque je teste l'animation, le produit vient bien, les 2 tweens se passent okay, la légende vient et repart à la fin du 2nd tween avec un removeChild(texte) , et lorsque je trace les éléments du xml n½ud "maselection" tout s'affiche nickel dans le panneau de sortie, l'image est bien cliquable et pointe bien vers le lien en question
mais lorsque je boucle....là ç'est la mort...:
quand met un :
for (var i:uint = 0;i<fichierXML.children().length();i++) {
avant // creation loader & conteneur
•toutes les images arrivent en même temps et apparemment seule la dernière arrivée est active (lien url) et effectue mon mvt tween, ma variable de count m'affiche toujour =0
j'ai essayé plusieurs types de répetitions "for each", "while" do..while" et en englobant ou non la déclaration des variables urlphoto..lienphoto...legendephoto
mais rien n'y fait...
voici la version de mon code sans la boucle avec juste une variable "i" mise à 0 (cas présent) pouvant être une des 18 selections du xml:
Code ActionScript :
//Importation des classes
import flash.display.Shape;
import flash.filters.DropShadowFilter;
import fl.motion.Animator;
import fl.motion.MotionEvent;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.*;
// Chargement des données et déclenchement de l'écouteur du chargement des données
var fichierXML:XML;
var chargeurDonnees:URLLoader = new URLLoader();
var adresseFichierXML:URLRequest = new URLRequest("slideshow.xml");
chargeurDonnees.load(adresseFichierXML);
chargeurDonnees.addEventListener(Event.COMPLETE, animation);
// Fonction à exécuter à la fin du chargement des données XML
function animation(event:Event):void {
fichierXML = new XML(chargeurDonnees.data);
// compteur
var count:uint=0;
// tri du XML et boucle
var i:uint = 0;
var urlPhoto:String = new String(fichierXML.dlc_selection[i].@dlc_image);//url de l'image de la selection
var lienPhoto:String = new String(fichierXML.dlc_selection[i].@dlc_lien);//le lien quand on clique sur la selection
var legendePhoto:String = new String(fichierXML.dlc_selection[i].@dlc_legende);// la légende de la selection
// creation loader & conteneur
var adresseImage: URLRequest = new URLRequest (urlPhoto);
var chargeur: Loader = new Loader ();//chargeur photo
chargeur.load(adresseImage);
var conteneur: Sprite = new Sprite();//conteneur photo
addChild(conteneur);
conteneur.addChild(chargeur);
conteneur.buttonMode = true;
conteneur.x = 180;
conteneur.y = 22;
//masque rectangle arrondi dans lequel les produits se déplacent
var rectangle:Sprite = new Sprite();// masque
rectangle.graphics.beginFill(0x000000);
rectangle.graphics.drawRoundRect(33,23,119,117,7);
rectangle.graphics.endFill();
this.addChildAt(rectangle,6);
conteneur.mask = rectangle;
// creation et mise en forme de la legende
var texte: TextField = new TextField();
var format:TextFormat = new TextFormat();
format.font = "Verdana";
format.size = 10;
format.color = 0xffffff;
format.bold = true;
format.align = "center";
format.leading = -1;
format.letterSpacing = -1;
texte.defaultTextFormat = format;
texte.setTextFormat(format);
texte.text = (legendePhoto);
texte.x = 18;
texte.y = 140;
texte.width = 144;
texte.height = 35;
texte.wordWrap = true;
texte.multiline = true;
// l'image conteneur cliquable > lien vers la page concernée
conteneur.addEventListener(MouseEvent.CLICK,clickHandler);
function clickHandler(event:MouseEvent):void {
navigateToURL(new URLRequest(lienPhoto));
}
//mvt tween
var bouge1:Tween;
var bouge2:Tween;
bouge1=new Tween (conteneur,"x",Strong.easeInOut,180,32,50,false);
bouge1.addEventListener(TweenEvent.MOTION_FINISH, deplacer);
function deplacer(e:TweenEvent):void {
addChild(texte);
bouge2=new Tween (conteneur,"x",Strong.easeIn,32,-120,35,false);
bouge2.addEventListener(TweenEvent.MOTION_FINISH, fin);
function fin(e:TweenEvent):void {
removeChild(conteneur);
removeChild(texte);
trace("c'est fait");
count++;
}//fin mvt tween
// visualisations des noeuds dans le panneau de sortie
trace("url photo = " + urlPhoto + " --legende Photo = " + legendePhoto +" ----lien Photo = " + lienPhoto);
trace("compteur = " +count);
}
// <<<normalement ici je met l'accolade droite de la fin de ma boucle for
}//fin de la fonction animation
je pense que, soit :
• je place mal ma boucle
• je met le mauvais type de boucle
• je gère mal mes addchild et removechild
• tout ça en même temps
• je devrais me contenter de faire des belles anims Flash ou after effect en dur, et les refaire à chaque changement de sélections ;-)
quelqu'un a t'il une solution ?