[AS3] Propriété custom sur un évènement souris + AJAX + SWFaddress

Propriété custom sur un évènement souris + AJAX + SWFaddress [AS3] - Flash/ActionScript - Programmation

Marsh Posté le 12-02-2009 à 21:06:54    

Bonjoir,
 
je suis en train de faire un petit diaporama de recettes de cuisine en Flash/AS3, et j'ai 3 2 1 questions pour les spécialistes.
 
Le programme charge la liste d'images (depuis xml) dans un scrollbar horizontal, et laisse l'utilisateur cliquer sur les images de recettes qui l'intéressent afin de charger la dite recette en HTML au-dessus du diaporama. Chaque nouveau clic entraine la modification de la zone HTML et son remplacement par une nouvelle recette SANS RECHARGEMENT de la page.
 
Mon fichier xml contient la liste des images, chaune d'entre elles possede 2 propriétés : un chemin (celui du fichier image sur disque) et un ID (celui de la recette HTML que je recupèrerai plus tard)
 
1. Je cherche à associer chaque image dans AS3 à chaque ID dans xml, de telle sorte qu'au clic je puisse récupérer le fameux ID et chercher après la bonne recette.
Mes images sont des instances de Loader, je parcours mon xml et charge chaque image grâce à son loader dédié :

Code :
  1. /* Chargement du xml */
  2. private function loadImagesPath():void
  3. {
  4.   var urlLoader:URLLoader = new URLLoader(); //conteneur de chargement du fichier XML
  5.   urlLoader.addEventListener(Event.COMPLETE, loadImagesPathCompleted); //abonnement à l'événement Event.COMPLETE
  6.   urlLoader.addEventListener(IOErrorEvent.IO_ERROR, loadImagesPathIoError); //abonnement à l'événement IOErrorEvent.IO_ERROR
  7.   urlLoader.load(new URLRequest("xml/RecipeSlideshow.xml" )); //chargement du fichier XML
  8. }
  9. /* Chargement des images */
  10. private function loadImagesPathCompleted(evt:Event):void
  11. {
  12.   xml = new XML(evt.target.data); //Récupération du flux XML
  13.   xmlList = xml.elements(); //Récupération de la liste des noeuds image
  14.   for each(var image:XML in xmlList)
  15.   {
  16.    var loader:Loader = new Loader(); //conteneur pour chaque image
  17.    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImageCompleted); //abonnement à l'événement Event.COMPLETE
  18.    loader.load(new URLRequest(image.@path)); //chargement de l'image
  19.   }
  20. }
  21. /* Chargement de chaque image */
  22. private function loadImageCompleted(evt:Event):void
  23. {
  24.   thumbsContainer.addEventListener(Event.ADDED, imageAdded); //abonnement du conteneur des vignettes à l'événement Event.ADDED
  25.   var loader:Loader = evt.target.loader; //conteneur de l'image
  26.   loader.width = 135; //largeur de la vignette
  27.   loader.height = 105; //hauteur de la vignette
  28.   thumbsContainer.addChild(loader); //ajout de la vignette dans le conteneur
  29. }
  30. /* Positionnement des images et callback sur clic souris */
  31. private function imageAdded(evt:Event):void
  32. {
  33.   var loader:Loader = evt.target as Loader; //la vignette qui est ajoutée
  34.   var conteneur:Sprite = evt.currentTarget as Sprite; //le conteneur des vignettes
  35.   var index:int = conteneur.getChildIndex(loader); //l'index dans la liste d'affichage
  36.   if(index != 0) //si la vignette n'est pas la première
  37.   {
  38.    var previousX:Number = conteneur.getChildAt(index - 1).getBounds(conteneur).right; //coordonnée X du côté droit de la vignette précédemment ajoutée
  39.    loader.x = previousX + SPACE_BETWEEN_THUMBS; //positionnement de la vignette 10 pixels après la vignette précédente
  40.   }
  41.   loader.addEventListener(MouseEvent.CLICK, vignetteClic); //abonnement à l'événement clic
  42. }
  43. /* Listener de clic souris */
  44. private function vignetteClic(evt:MouseEvent):void
  45. {
  46.   var loader:Loader = evt.target as Loader;
  47. }


Je ne sais pas du tout à quel objet associer mon ID (image.@id). J'ai essayé de rajouter une propriété "id" au Loader pour la récupérer au clic, mais la classe Loader m'en empêche. [:airforceone]
 
 
2. Le clic sur une image entraine l'affichage de la recette, mais j'ai pour imperatif de ne pas recharger la page (et donc le Flash) à chaque clic. Je suppose qu'il faut passer par une couche JS depuis laquelle je ferais un appel "AJAX" afin de charger le contenu. Est-ce la bonne demarche ? Sachant que je ne sais pas (encore) si Flash est capable de lancer un script JS...
 
 
3. Il faudrait que l'url soit dédiée à chaque recette, sans pour autant recharger le contenu à chaque appel. SWFaddress est-il mon ami dans ce cas ?
 
 
Posez-moi des questions sur les points pas clairs, j'essaierai (compte-tenu de mon pov' niveau en AS) de vous répondre [:bbcmoi]


Message édité par lkolrn le 15-02-2009 à 23:51:18
Reply

Marsh Posté le 12-02-2009 à 21:06:54   

Reply

Marsh Posté le 12-02-2009 à 21:43:55    

Je viens d'y penser (sisi, ca m'arrive des fois) : pour le point 1 je pourrais ptet deriver la classe Loader et lui ajouter la/les proprietes dont j'ai besoin...
 
V tenter de suite

Reply

Marsh Posté le 12-02-2009 à 21:55:35    

easy :sol:  
 
Une inspiration pour les 2 points suivants ?
 
 :jap:  
 

Reply

Marsh Posté le 12-02-2009 à 23:35:20    

Bon, ya un truc dans AS3 qui s'appelle ExternalInterface (import flash.external.ExternalInterface), et qui permet de faire des appels JS.
 
Pour ceux que ca intéresse :

Code :
  1. if(ExternalInterface.available)
  2. {
  3.    var js:String = new String("function(){alert('ahah!');}" );
  4.    ExternalInterface.call(js);
  5. }

Reply

Marsh Posté le 15-02-2009 à 23:50:11    

A vot' bon coeur m'sieurs dames !
 
Juste pour la 3 => vais-je pouvoir m'en sortir avec SWFAddress ?
 
Je parcours la doc mais ca n'est pas super clair pour l'instant (pour moi)...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed