Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1155 connectés 

  FORUM HardWare.fr
  Programmation
  Flash/ActionScript

  Petites questions d'Action Script 3

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petites questions d'Action Script 3

n°2070056
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 14-04-2011 à 17:21:33  profilanswer
 

Bonjour tout le monde !
 
J'ai une petite question d'AS3.
 
j'ai réalisé une galerie dynamique (ma première), et j'arrive à mes fins, seul un point me résiste.
 

Code :
  1. function loadPhoto (evt:Event):void {
  2. var chargeur:Loader = new Loader();
  3. var maRequete:URLRequest = new URLRequest("./img/"+currentFrame+".jpg" )
  4. chargeur.load ( maRequete )
  5. addChild (chargeur);
  6. trace(chargeur.width)
  7. chargeur.x=(412-chargeur.width)/2
  8. }


 
Vous aurez compris, j'ai une série de frame, à chaque frame il charge un jpg dont le nom est le numéro de frame. J'ai sur chaque frame le code suivant, c'est ptet pas très catholique mais là n'est pas la question :
 

Code :
  1. while( this.numChildren > 0 ) this.removeChildAt( 0 );
  2. this.addEventListener(Event.ENTER_FRAME, loadPhoto)


 
Ce que je souhaite faire, c'est centrer mes images dans une zone de 412 pixels de large (ma "fenêtre" maximale dans lesquelles toutes les photos doivent rentrer).
 
L'image étant placée à l'origine, qui est au coin supérieur droit, il faut donc qu'elle se décale de la moitié de 412 moins la largeur de la photo.
 
Le souci, c'est que le chargeur.width retourne 0, alors que la photo est chargée juste au dessus, et je n'arrive pas à trouver la subtilité de la manipulation des enfants...
 
Si vous pouviez me dire où j'ai merdé, ça serait gentil :o
 
Et je me demande s'il ne serait pas pertinent qu'un topic existe pour poser ce genre de petites questions sans avoir à polluer la sous-cat, auquel cas ce topic pourrait le devenir si la modération approuve :o


---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
mood
Publicité
Posté le 14-04-2011 à 17:21:33  profilanswer
 

n°2070121
abais
Posté le 14-04-2011 à 23:38:42  profilanswer
 

Non...
Il y a le "pas très catholique", et le "affreux". Le prend pas mal hein, j'ai aussi fais des chose horrible lors de mon apprentissage, mais quand même !
Je pense que tu comprend même pas les lignes que tu nous donnes...

 

quel est l'interet d'écouter un EnterFrame à chaque frame...  :whistle: ?
Pourquoi vides-tu ton clip à chaques frame ?
As tu conscience que tu créé 1 loader par frame à l'infini ? (vive la consomation mémoire)
...

 

Pour répondre à ta question, c'est très simple, entre l'exécution de l'instruction chargeur.load ( maRequete ) et trace(chargeur.width), il se passe à peine 1 millième de seconde... bref, NON, la photo n'a absolument pas le temps de charger entre temps ! c'est pour celà que rien est exploitable...

 

Il faut que tu place l'image seulement une fois qu'elle a chargée

 

Reprend à 0 ton code.
Je t'aiguille, il n'est pas judicieux d'utiliser les keyframes de flash, elles sont utile pour animer dans l'API, mais pas pour être manipuler en AS...
Le mieux est de charger toutes tes images à l'aide d'une boucle, une fois fini, tu les affiches une à une, soit au rythme des frames avec un EnterFrame, soit à l'aide d'un timer (exemple : toute les 30ms).

Code :
  1. var nombreImage:uint = 20; //ici tu met e nombre d'image
  2. var compteur:uint = 0; // On crée un compteur... il doit commencer par le numéro de la premiere image (0 ou 1 ?)
  3. var listeImage:Array = new Array(); // On crée une liste qui répertoriera les images...
  4. var animation:MovieClip = new MovieClip(); // On déclare le clip qui contiendra les images, ce serait bordélique de tout foutre direct dans le stage...
  5. var loader:Loader = new Loader(); //On créer un loader
  6. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); // On écoute la fin de chaque chargement
  7. loader.load(new URLRequest("./img/0.jpg" )); // On charge la premiere image...
  8.  
  9. function onCompleteHandler(e:Event):void
  10. {
  11.        trace("L'image "+e.currentTarget.url+" a été chargé" );
  12.        var monImage:Bitmap = Bitmap(e.currentTarget.content); // On stock le contenu chargé dans un objet Bitmap
  13.        listeImage.push(monImage); // On l'ajoute à notre liste
  14.        monImage.x = monImage.width * - 0.5 // On la place (de manière à ce que l'origine du conteneur soit au milieu de l'image...)
  15.        monImage.y = monImage.height * - 0.5;
  16.  
  17.        // Si il reste encore des images à charger :
  18.        if(compteur < (nombreImage - 1))
  19.        {
  20.                compteur++; // On incrémente notre compteur
  21.                trace("On charge maintenant : ./img/"+compteur+".jpg" );
  22.                loader.load(new URLRequest("./img/"+compteur+".jpg" )); // On charge la suivante
  23.        } else { // Sinon, on peux lancer notre animation !
  24.                trace("Toutes les images sont chargées !" );
  25.                loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler); // Dejà, on arrete d'écouter le loader inutilement
  26.                addChild(animation); //On ajoute "animation" au stage
  27.                animation.addChild(listeImage[0]); // On ajoute la 1ere image au clip animation
  28.                compteur = 0; // On recycle cette variable qui nous resservira à connaitre l'image actuellement affichée
  29.                this.addEventListener(Event.ENTER_FRAME, afficherLaBonneImage); // et on lance la machine !
  30.        }    
  31. }
  32.  
  33. function afficherLaBonneImage(e:Event):void
  34. {
  35.        // Bon, on a un clip... On fait quoi à chaque frame ? On retire l'image actuelle pour afficher la suivante !
  36.        compteur = (compteur + 1) % nombreImage; // On determine la prochaine image à afficher.
  37.        // Le "% nombreImage" est très important, c'est un "modulo", ça permet de reprendre à 0 après la dernière image.
  38.        animation.removeChildAt(0); // On retire le 1er (et unique) enfant actuel...
  39.        animation.addChild(listeImage[prochaineImage]);// On ajoute le suivant
  40. }
 

Et voila, propre et léger. Bien sûre, je n'ai pas testé, j'espere qu'il n'y a pas d'étourderie.
Si jamais, dis moi ce que tu ne comprend pas


Message édité par abais le 14-04-2011 à 23:40:13

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
n°2070125
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 15-04-2011 à 00:45:32  profilanswer
 

Merci pour cette réponse assez claire. C'est vrai que j'ai une approche batarde, ca vient du fait que je viens d'une approche totalement graphique et j'ai un peu de mal a faire abstraction de la timeline... Pour dire, si j'avais pas 70 images, je les auraient toute mise sur un calque guide pour bien me representer la chose.

 

Bon je poste de mon telephone, donc j'ai juste le lu le code (moi pas tres bien l'ecrire, mais bien lire quand meme), la seule chose qui me questione, c'est que ce code charge toutes les photos d'un coup, si j'ai compris, et ca m'embete... Si je me suis forcé a tenter une approche dynamique, c'est justement pour ne pas avoir un SWF de 2 Mo, si c'est pour avoir autant a loader dans ma gallerie, l'interet est limité...

 

En fait ce que je souhaite, c'est charger une image, la centrer, l'afficher, puis quand l'utilisateur veut voir la suivante, supprimer l'image et charger la suivante, avec une petite tween pour enrober le tout. Chaque image pese 40 ko max... Mais apres c'est ptet pas la bonne approche...

n°2070139
abais
Posté le 15-04-2011 à 07:47:05  profilanswer
 

Ah ok, je pensais que tu chargeais une sequence d'image (animation) !
Du coup en effet, je charge tout 1 à 1...
 
Alors du coup, la solution est de référencer tes images dans un XML.
Il faut en principe 2 loader et 2 conteneur, ça te permettra de faire une transition entre l’ancienne et la nouvelle image.
A la fin de la transition, tu unload l'ancienne image pour libérer la mémoire.
Pour les Tween, je te suggère TweenLite de greensock, qui est + léger et + éfficace que le tween par défaut d'AS3.


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
n°2070175
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 15-04-2011 à 09:31:06  profilanswer
 

abais a écrit :

Ah ok, je pensais que tu chargeais une sequence d'image (animation) !
Du coup en effet, je charge tout 1 à 1...

 

Alors du coup, la solution est de référencer tes images dans un XML.
Il faut en principe 2 loader et 2 conteneur, ça te permettra de faire une transition entre l’ancienne et la nouvelle image.
A la fin de la transition, tu unload l'ancienne image pour libérer la mémoire.
Pour les Tween, je te suggère TweenLite de greensock, qui est + léger et + éfficace que le tween par défaut d'AS3.

 

Oula, 2 conteneurs qui se relaient, ca me fait un peu peur [:tinostar]

 

Sinon j'utilise TweenMax sur tout le projet ;)

n°2070191
abais
Posté le 15-04-2011 à 10:04:50  profilanswer
 

lxl ihsahn lxl a écrit :


Sinon j'utilise TweenMax sur tout le projet ;)


TweenMax est au moins aussi bien ;)

lxl ihsahn lxl a écrit :


Oula, 2 conteneurs qui se relaient, ca me fait un peu peur [:tinostar]


Commence avec un seul alors, mais le double loader est indispensables afin de bien décharger l'image disparu APRES avoir affiché la suivante (ce qui permet une transition)


Message édité par abais le 15-04-2011 à 10:06:05

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
n°2070230
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 15-04-2011 à 11:19:18  profilanswer
 

En fait ce qui m'a fait utiliser la timeline, c'est que la succession de photos est découpé en galleries, et que des miniatures pointent dessus. Et faire un "this.xxx.gotoAndStop('nomGallerie')" c'est assez facile.
 
Faudrait que je fasse un xml, intégrant les infos des catégories, l'url des images, toutes les infos, mais j'ai encore beaucoup de mal avec ça :D


---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
n°2070272
abais
Posté le 15-04-2011 à 13:16:54  profilanswer
 

Je ne peux pas trop t'aider vu que je ne sais pas ce que tu as dans la tête en terme d'ergonomie, mais le fait de passer par la TimeLine n'as rien de dynamique.
Ça dépendra aussi de tes motivations, mais moi, plus je gobe de l'AS, moins je me sert de l'API Flash, et pourtant, je suis graphiste de base.


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
n°2070286
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 15-04-2011 à 13:58:03  profilanswer
 

Oui c'est une question d'habitude, mais jsuis pas encore prêt pour m'affranchir de l'aspect conception graphique de flash...
 
En fait je ne cherche pas forcément à faire du 100% dynamique, juste à le pas avoir un swf trop lourd, et charger les images juste au moment où on en a besoin, et en les supprimant après.  
 
C'est la seule chose que je regrette de l'AS2, le loadMovie qui était si simple à utiliser... Et cette notion de child qui est hyper restrictive... par exemple, j'ai ajouté dynamiquement sur un autre projet une vidéo youtube (avec lecteur embeded), et bien je n'ai pas réussi à detruire la vidéo autrement que par un code situé dans le même clip que la vidéo, et comme j'avais construit mon interface avec des frames en guise de page, impossible de passer d'une page à l'autre tout en tuant la vidéo... j'ai surement mal fait mon truc, mais le fait qu'il faille faire un addChild pour pouvoir faire un removeChild, alors que les clips déjà imbriqués dans un autre sont a proprement parler aussi de fils même si on ne les a pas charger dynamiquement...
 
Bref, c'est hyper pas facile pour moi, mais ça va venir :lol:


---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
n°2070320
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 15-04-2011 à 15:38:00  profilanswer
 

Bon j'ai réussi à modifier mon code temporairement pour qu'il soit fonctionnel (j'ai ajouté un écouteur Event.COMPLETE sur le chargeur et ça marche) , j'ai besoin d'un truc rapidement fonctionnel, mais je me contraindrais à le refaire de façon plus logique par la suite ;)

 

Par contre j'ai eu une idée pour boucler ma série d'image, plutot que le truc batard de mettre des gotoAndStop en première et dernière image vide de la séquence :

 

J'ai mis un label "debut" sur la première image, et un label "fin" sur la dernière, et sur mes boutons qui agissent en prevFrame() et nextFrame() j'ai ajouté une condition, du genre

 
Code :
  1. if (galerie.currentLabel == 'debut') // si on est au début de la galerie
  2. {
  3.   galerie.gotoAndStop('fin') // retourner à la fin
  4. }
  5.  
  6. else  // sinon
  7. {
  8.   galerie.prevFrame()  // aller à la frame précédente
  9. }
 

Je pense avoir bien compris mon propre code, en toute logique ... :o
Mais quand je suis en frame 1 et que je clique sur le bouton, il me met en frame 1 une fois (avec 90 "Error #2044: IOErrorEvent non pris en charge : text=Error #2035: L'URL est introuvable." en sortie), et ne pars en 'fin' qu'au second clic. J'ai essayé de remplacer les currentLabel par des currentFrame et leur numéro, mais rien n'y fait... pourtant ma fonction devrait lire le label avant de décider quoi faire...

 


Message édité par lxl ihsahn lxl le 15-04-2011 à 15:46:47

---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
mood
Publicité
Posté le 15-04-2011 à 15:38:00  profilanswer
 

n°2070381
abais
Posté le 15-04-2011 à 20:36:45  profilanswer
 

il y a les modulos aussi à ne pas oublier... ça te permet de boucler un nombre. renseigne toi dessus.
Sinon l'AS2 est très obsolète et lourd, tout ce qui se fait en AS2 est possible en AS3, sauf que la rigueur est obligatoire.


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
n°2070416
lxl ihsahn​ lxl
●⌠ Antaigris ⌡●
Posté le 16-04-2011 à 10:32:12  profilanswer
 

Je ne regrette pas AS2 dans l'ensemble, non :D

 

les modulos ? Boucler un nombre ? Modulo, c'est le reste d'une division, là j'ai un numéro de frame ou un nom de label, je ne vois pas :??:

 

edit: ah, tu veux dire qu'il faudrait que je fasse une boucle infinie, qui calcule le reste de la division de i par la longueur de ma timeline, avec une incrémentation dans un sens ou l'autre suivant la flèche cliquée...

 

C'est pas gênant, cette possibilité d'incrémenter à l'infini ?


Message édité par lxl ihsahn lxl le 16-04-2011 à 10:43:48

---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
n°2070508
abais
Posté le 17-04-2011 à 12:21:28  profilanswer
 

Bah, tu as une variable "currentImage" (enfin, tu la nommes comme tu veux) qui te stock l'image actuelle ( 0 par défaut), puis "nbreFrame" le nombre de frame.
currentImage démarre a 0, tu as donc un déballage de 1 avec les drames correspondante.
Tu fais une fonction :

 

goToImage(index:int)
{
  currentImage = (index + nbreFrame) % nbreFrame;
  // le + nbreFrame est la pour palier aux nombres négatifs

 

 gotoAndStop(currentImage + 1);
  // le +1 parce qu'une timeline démarre a 1 et non 0
}

 

Ton bouton suivant fait goToImage(currentImage + 1) et le précédent : goToImage(currentImage - 1)


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Flash/ActionScript

  Petites questions d'Action Script 3

 

Sujets relatifs
[PHP] Recherche script d'enchères[Demande]: petit script simple
aide pour script reservation d'ateliersnouvelle extension pour script upload file
problème script export csv phpMes questions sur Python
[Script Batch] Un /p dans un IF EXIST ?[Script Batch] Trouver tous les fichiers dont la taille est sup à "X"
Aide Creation script 
Plus de sujets relatifs à : Petites questions d'Action Script 3


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR