[Flash AS2] Problème de preload en XML

Problème de preload en XML [Flash AS2] - Flash/ActionScript - Programmation

Marsh Posté le 04-11-2007 à 23:29:13    

Bonjour, mon problème est en rapport avec l'action script 2 et le XML
 
Voilà je désire preloader une image dans chacuns des 3 movieclip ("holder", "holder2"," holder3" ), le problème est que mon code de preload fonctionne pour le 1er movieclip "holder" mais pour les autres ça ne precharge pas :/ voici mon code :
 
AS pour loadé le fichier XML :
 

Code :
  1. // Création du XML
  2. var xml:XML = new XML();
  3. // On ignore l'espace blanc
  4. xml.ignoreWhite = true;
  5. // Appel de la fonction une fois loadé
  6. xml.onLoad = function() {
  7. var nodes = this.firstChild.childNodes;
  8. // Nombre d'items
  9. numOfItems = nodes.length;
  10. // Attachement des icons
  11. for (var i = 0; i<numOfItems; i++) {
  12. //--------------------------------------------------------------------
  13. // Chargement des images dans le MC
  14.   holder.loadMovie(nodes[i].attributes.image1);
  15.   holder2.loadMovie(nodes[i].attributes.image2);
  16.   holder3.loadMovie(nodes[i].attributes.image3);
  17.  
  18. // Chargement du texte
  19.   bloctext.myText.text = nodes[i].attributes.caption;
  20. }
  21. };
  22. // Chargement du fichier XML
  23. xml.load("xml/images.xml" );


 
AS du preloader :
 

Code :
  1. onEnterFrame = function () {
  2.         loading = (_parent.holder,_parent.holder2,_parent.holder3).getBytesLoaded();
  3.         total = (_parent.holder,_parent.holder2,_parent.holder3).getBytesTotal();
  4.         percentage = Math.round((loading / total) * 100);
  5.         if (isNaN(percentage) or (percentage == 0)) {
  6.             percentage = 0;
  7.             left.half._rotation = 0;
  8.             right.half._rotation = 0;
  9.         } else if ((percentage <= 50) && (percentage > 0)) {
  10.             left.half._rotation = 0;
  11.             right.half._rotation = 3.6 * percentage;
  12.         } else if ((percentage > 50) && (percentage < 100)) {
  13.             left.half._rotation = 3.6 * (percentage - 50);
  14.             right.half._rotation = 180;
  15.         }
  16.         if ((percentage == 100) && (total > 100)) {
  17.             left.half._rotation = 180;
  18.             right.half._rotation = 180;
  19.             if (this._alpha > 0) {
  20.                 this._alpha = this._alpha - 10;
  21.             }
  22.             if ((_parent.holder,_parent.holder2,_parent.holder3)._alpha < 100) {
  23.                 (_parent.holder,_parent.holder2,_parent.holder3)._alpha = (_parent.holder,_parent.holder2,_parent.holder3)._alpha + 10;
  24.             }
  25.         } else if (percentage < 100) {
  26.             if (this._alpha < 100) {
  27.                 this._alpha = this._alpha + 10;
  28.             }
  29.             (_parent.holder,_parent.holder2,_parent.holder3)._alpha = 0;
  30.         }
  31.         _parent.bloctext._alpha = (_parent.holder,_parent.holder2,_parent.holder3)._alpha;
  32.         percentageTxt = percentage;
  33.     };
  34.     stop();


 
et enfin le fichier XML en lui meme :
 

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <IMAGES>
  3. <image
  4.  image1="img/img1.jpg"
  5.  image2="img/img2.jpg"
  6.  image3="img/img3.jpg" 
  7.  caption="Découvrez nos luxeuses chambres, adaptées à vos besoins et vos budgets blablablablablabla"/>
  8. </IMAGES>


 
Voilà donc en gros je voudrais que mon preloader preloade chaques images contenues dans les 3 mc (ex : image1 preloadée dans mc1 image2 dans mc2 etc...)
 
Si quelqu'un peut m'aider c'est super ! Merci beaucoup, :)

Reply

Marsh Posté le 04-11-2007 à 23:29:13   

Reply

Marsh Posté le 04-11-2007 à 23:55:08    

c'est pas de l'AS2 ça.

Reply

Marsh Posté le 05-11-2007 à 03:38:45    

Réponse constructive et totalement raccord avec le sujet ^^ et à part ça ?

Reply

Marsh Posté le 05-11-2007 à 03:48:35    

Ton code de preload est 10 fois trop compliqué. Par exemple traiter tes 3 images en meme temps c'est super bizare.
Comme le sous entend Antika, une classe aurait ete la bienvenue.
Sinon une fonction peut faire l'affaire. Ensuite t'envoie chaque holder a ta fonction qui s'occupe du reste. L'interet de bosser comme ca, c'est que d'abord, c'est 10fois plus clair et ensuite le jour ou tu dois ajouter une autre image, c'est facile comme une ligne de code.


---------------
Jeu de simulation Boursière - Version BETA - https://www.facebook.com/wildstocks
Reply

Marsh Posté le 05-11-2007 à 06:54:12    

Merci pour ta réponse, tout dabord si je preload une image dans chaques mc c'est pour animer à ma guise le mc en question je peux ainsi manipuler sur la timeline le mc holder, holder2 ou holder3 à ma guise.

 

Quelle serait la solution alors pour garder mon idée de base (preloader plusieurs images dans 3 mc differents en XML) ?

 

La solution que tu évoques m'a l'air sympa mais ça fonctionne avec le XML ? Serait t-il possible (si tu as le temps) de me faire l'AS pour que ça fonctionne comme ça ? (j'en demande peut etre beaucoup) ^^

 

Merci,


Message édité par ludo-r le 05-11-2007 à 07:01:40
Reply

Marsh Posté le 05-11-2007 à 07:04:51    

Dans les grandes lignes
function preload (targ:MovieClip, img:String){
ici targ c'est holder et ton img tu la tiens de ton xml, que tu devrais d'ailleurs mettre dans un tableau pour pouvoir le reutiliser facilement.
 
Ensuite tu utilises MovieClipLoader pour charger ton image.
Et grace aux fonctions de loading de celui-ci tu peux modifier ta barre de progression, que tu plqces devant holder avec un DuplicateMovieClip()
 
Et voila
}


---------------
Jeu de simulation Boursière - Version BETA - https://www.facebook.com/wildstocks
Reply

Marsh Posté le 05-11-2007 à 20:19:30    

Citation :

Réponse constructive et totalement raccord avec le sujet


 

Code :
  1. class ImgBarDataXML() implements IImgBarData {
  2. public function load( pSource:String ):Void {
  3. ...
  4. }
  5. private function onLoad():Void {
  6. ...
  7. dispatchEvent({ type:'onDataLoad' });
  8. }
  9. }


 
L'interface c'est pour pouvoir changer à la volée ta couche de données en Remoting, à l'occasion, pour rigoler (ou comment faire des versions CD-ROM en 2h de sites énormes en implémentant l'abstraction de données sur du full-flash - c'est véridique :lol: ) :

Code :
  1. class ImgBarDataAMF() implements IImgBarData {
  2. public function load( pSource:String ):Void {
  3. ...
  4. }
  5. private function onResult():Void {
  6. ...
  7. dispatchEvent({ type:'onDataLoad' });
  8. }
  9. }


 
L'interface c'est vaguement ça :

Code :
  1. interface IImgBarData {
  2. public function load(pSource:String):Void;
  3. ...
  4. //(+ méthodes publiques de l'EventDispatcher)
  5. }


 
le code du composant c'est ça - on notera le coup de l'Iterator, toujours très clâssieux pour éviter les boucles for...next (c'est vulgaire!) :

Code :
  1. class ImgBar extends MovieClip { // extends UIComponent pour un vrai composant
  2. private var _data:IImgBarData;
  3. public function ImgBar(pMode:String) {
  4. if(pMode == 'XML') // diantre, j'ai oublié comment faire un nom de classe dynamique à partir d'une String, qui peut corriger?
  5. _data = new ImgBarDataXML();
  6. _data.addEventListener( 'onDataLoad' );
  7. //...idem si pMode == 'AMF' pour utiliser la couche Remoting à la place...
  8. private function onDataLoad(e:Object):Void {
  9. var _dataItr:Iterator = _data.getIterator();
  10. while(_dataItr.next()) {
  11. //...on attache les sous-composants servant à charger les images...
  12. //...et on les intialisent avec les données de path corrects...
  13. //...et on lance le chargement sur chaque image séparée...
  14. }
  15. }
  16. }
  17. }


 
le code du sous-composant :
 

Code :
  1. class ImgHolder extends MovieClip { // normalement, il devrait plutôt étendre ImgHolder, et ImgHolder devrait être un de tes composants persos les plus utilisés
  2. private var _mcl:MovieClipLoader;
  3. private var _holder:MovieClip;
  4. public function ImgHolder() {
  5. ...
  6. }
  7. public function set filename(pFilename:String):Void {
  8. // en utilisant un setter implicite, tu peux directement déclenché le chargement en faisant <instance>.filename = 'nom_du_fichier', c'est + joli
  9. _mcl.loadclip(pFilename, _holder);
  10. }
  11. // gestion des événements du MovieClipLoader, bubbling à traver le composant principal, et hop, on touche à la perfection
  12. }
  13. }


 
Ne pas oublier des événements typés, et la gestion des exceptions.
 

Citation :

et à part ça ?


 
ça c'est l'AS2, et toi tu sors.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(sans déconner, moi je fais vraiment comme ça  :lol:  )


Message édité par antika le 05-11-2007 à 20:38:48
Reply

Marsh Posté le 05-11-2007 à 20:45:52    

hahalala, j'oublie le plus important : converti _holder en BitmapData dans ImgHolder, comme ça tu peux le tourner et le scaler, et faire des rollOvers super-disco en code avec Fusekit, miam.

Reply

Marsh Posté le 05-11-2007 à 21:52:11    

Super merci ! Je m'en vais tester ça ^^

Reply

Marsh Posté le 06-11-2007 à 10:41:03    

antika a écrit :

hahalala, j'oublie le plus important : converti _holder en BitmapData dans ImgHolder, comme ça tu peux le tourner et le scaler, et faire des rollOvers super-disco en code avec Fusekit, miam.


 
Fusekit c'est pour les filles  :D

Reply

Marsh Posté le 06-11-2007 à 10:41:03   

Reply

Marsh Posté le 06-11-2007 à 21:55:26    

tu suggères quoi?

Reply

Sujets relatifs:

Leave a Replay

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