IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Mettre en tableau les num des frames qui ont du code


Sujet :

ActionScript 3

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Mettre en tableau les num des frames qui ont du code
    Bonjour et merci d'avance !

    Je cherche à parcourir toute la mainTimeline pour mettre en tableau les numéros des frames qui ont un code "stop();" dans un layer donné.
    Mais je n'arrive pas à relier layer/frame/code (très faible en POO).

    Tout nouveau sur Flash, j'ai su programmer un diaporama animé de stops en stops en mémorisant au fur et à mesure les numéros des frames sur lesquelles je m'étais arrêté (pour revenir en arrière juste sur les stops), mais pour progresser dans les fonctionnalités, je dois remplir ce tableau une fois pour toute, au début du code, avant le parcours du diaporama.

    L'impératif, c'est de n'utiliser que la mainTimeline (pour pouvoir exporter le film en séquence d'images). Je ne sais pas où l'utilisateur placera ses stop().

    Pouvez-vous m'aiguiller ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 197
    Points : 89
    Points
    89
    Par défaut
    Salut,

    L'AS3 n'est pas vraiment fait pour sa, l'AS2 est plus adapté est plus simple si tu ne maitrise aucun des deux.

    Je ne peut que te conseiller de d'abord lire et tester la classe MovieClip qui intègre la timeline à l'inverse de la classe de base Sprite.
    Accessible ici:
    http://help.adobe.com/en_US/FlashPla...MovieClip.html

    Si tu la maitrise tu pourra faire tous ce que tu veux.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par carton99 Voir le message
    d'abord lire et tester la classe MovieClip qui intègre la timeline
    Merci. J'ai effectivement beaucoup tourné autour de MovieClip pour comprendre la logique de Flash, mais j'ai encore quelques soucis (pour un bête code qui devrait faire moins d'une dizaine de lignes)

    Le code suivant est placé dans le "layer" "Action" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // this = MovieClip(root) = [object MainTimeline]
    var tableau:Array = new Array();
    for(var i:int = 1; i <= this.totalFrames; i++){
    	this.gotoAndStop(i); // fonctionne visuellement
    	trace(this.currentFrame); // Toujours à "1" ???
    	// j'ajoute cette suite pour montrer ce que je cherche mais c'est nawac
    	if(this.stop()){ // impossible car :void mais comment faire, alors ?
    		tableau.push(this.currentFrame);
    	}
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 197
    Points : 89
    Points
    89
    Par défaut
    Salut,

    Le problème c'est que tu n'a pas une logique de programmation. On ne peut pas faire ce que tu souhaite comme tu l'a écrit.

    De plus tu essais de faire quelque chose d'un peu tordu qui demande un certain niveau en AS3.


    Sans voir tous le projet c'est assez dur mais moi ce que je ferais sa serais de mettre dans une boucle un gotoAndPlay.
    Car le gotoAndPlay sera arrêter par un stop()
    il faut allors créer un évenement pour récupérer ce stop puis stocker la currentframe associé dans ton tableau.
    Puis vérifier que le programme ne tourne pas en boucle.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par carton99 Voir le message
    Le problème c'est que tu n'a pas une logique de programmation. On ne peut pas faire ce que tu souhaite comme tu l'a écrit.
    Je n'ai pas une logique de POO, en effet
    Citation Envoyé par carton99 Voir le message
    ce que je ferais sa serais de mettre dans une boucle un gotoAndPlay. Car le gotoAndPlay sera arrêter par un stop()
    Ah mais ouiiii ! C'est exactement ce que j'avais fait, mais en direct-live (sans boucle) et ça fonctionnait très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    stop();
    // Boutons Suite / Retour
    b_suiv.addEventListener(MouseEvent.CLICK, clickSuivant);
    b_prec.addEventListener(MouseEvent.CLICK, clickPrecedent);
    function clickSuivant(event:MouseEvent) { suivant(); }
    function clickPrecedent(event:MouseEvent) { precedent(); }
    // Clavier Flèches
    stage.addEventListener(KeyboardEvent.KEY_DOWN, clavierChoix); 
    function clavierChoix(event:KeyboardEvent):void{ 
    	switch(event.keyCode){
    		case 39: suivant(); break;
    		case 37: precedent(); break;
    		case 38: debut(); break;
    		case 40: fin(); break;
    	}
    } 
     
    var tPrec:Array = new Array();
    function suivant() {
    	if(this.currentFrame < this.totalFrames){
    		tPrec.push(this.currentFrame);
    		gotoAndPlay(this.currentFrame + 1);
    	}
    }
    function precedent() {
    	var tFin = tPrec.length;
    	if(tFin > 0){
    		gotoAndPlay( tPrec[tFin - 1] );
    		tPrec.pop();
    	}
    }
    function debut() { gotoAndPlay(1); };
    function fin() { gotoAndStop(this.totalFrames); }
    Je vais voir si je peux intégrer cette logique dans une boucle (sauf que le currentFrame ne semblait pas marcher, dans mon exemple précédent : quid ?)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 197
    Points : 89
    Points
    89
    Par défaut
    Oui,
    il reste le mystère du "this.currentFrame", mais bon ton code était vraiment bizarre, je vois plusieurs raison mais sa serais long à expliquer.

    Le mieux c'est de mettre le "trace(this.currentFrame)" dans l'événement "enterFrame", comme sa tu est sur de ce qui se passe et l'affichage ne pourra pas être tronquer.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par carton99 Voir le message
    mettre dans une boucle un gotoAndPlay. Car le gotoAndPlay sera arrêter par un stop()
    Alors, j'ai dû adapter l'idée car un gotoAndPlay() dans une boucle for(), c'est pas très possible : le temps qu'il commence à "player", la boucle a déjà fait un tour et demande de "player" l'indice suivant !
    ...mais j'avais constaté une différence entre gotoAndStop() et nextFrame() : le second est arrêté par des stop();
    Donc voilà ce que j'ai fait... sauf que ça ne marche toujours pas à cause de ce fichu this.currentFrame qui ne bouge pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // this = MovieClip(root) = [object MainTimeline]
    var tableau:Array = new Array();
    var framePrec:int = 0;
    for(var i:int = 1; i <= this.totalFrames; i++){
    	this.nextFrame();//tente une avancée, mais ne peut la faire s'il y a un stop()
    	trace("MovieClip(root) = "+MovieClip(root)+" - Frame n° "+MovieClip(root).currentFrame+"-  i = "+i);
    	// MovieClip(root).currentFrame = toujours "1" !!!
    	if(this.currentFrame == framePrec){//avancée non-aboutie, donc détecte un stop()
    		trace("Frame n° "+this.currentFrame+" i = "+i);
    		tableau.push(this.currentFrame);// mémorise cette frame qui a un stop()
    		this.gotoAndStop(this.currentFrame + 1);//saute le stop() (goto n'y est pas sensible)
    	}
    	framePrec = this.currentFrame;
    }

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 197
    Points : 89
    Points
    89
    Par défaut
    Essai de placer le "trace(this.currentFrame)" juste avant le for et execute le programme pour voir ce qui se passe.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par carton99 Voir le message
    Essai de placer le "trace(this.currentFrame)" juste avant le for et execute le programme pour voir ce qui se passe.
    Voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var tableau:Array = new Array();
    var framePrec:int = 0;
    trace("Frame n° "+this.currentFrame);
    for(var i:int = 1; i <= this.totalFrames; i++){
    (...)
    Mais ça, c'est plutôt normal : la tête de lecture est sur "1" au début, et le layer "Action" dans lequel se trouve ce code va de la frame 1 à 50 (j'ai 3 layers : "Action", "Boutons" et "Dessins". Les 2 premiers vont de 1 à 50 et le troisième comporte 50 keyframes)

    Et au cas où tu me le demanderais, j'ai supprimé le test if() et ai mis un "trace("30 :"+this.currentFrame)" dans le layer "Dessins" à la frame 30. Résultat : il n'est pas affiché
    (alors que les 50 itérations se sont bien faites, this.currentFrame restant à 1 et "this = [object MainTimeline]")

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 197
    Points : 89
    Points
    89
    Par défaut
    Ok donc tu n'a plus le choix il faut intégrer ta boucle en supprimant le for dans un évenement enterFrame.

    http://help.adobe.com/en_US/FlashPla...ml#ENTER_FRAME

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    addEventListener(Event.ENTER_FRAME,myFunction);
    function myFunction(event:Event) {
    	trace("Do Something");
            trace(currentFrame);
    }
    Comme je l'avais dit avant le currentFrame ne peut pas être tronquer dans cet évenement.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par carton99 Voir le message
    Ok donc tu n'a plus le choix il faut intégrer ta boucle en supprimant le for dans un évenement enterFrame.
    Je suis finalement arrivé à quelque chose d'une manière détournée :

    - comme il ne semble pas possible de lister simplement les frames (pas de tableau mc.currentFrames[]) et de lire leurs scripts, je fais l'inverse : j'injecte les scripts dans la timeline, comme ça, je sais où ils se trouvent.
    - j'ai vu qu'il y avait un tableau pour lister les labels (var labels:Array = mc.currentLabels)
    - je pars donc des étiquettes, sur lesquelles l'utilisateur (graphiste-animateur) définit ses besoins en boucles (unique, infinie...) ou diapos (stop) à partir d'un code simple ("anim1" = 1 fois, "anim1-" = infinie).
    - je traduis ensuite ce code en instructions gotoAndPlay(retour) ou stop() que j'injecte dans le script de ma timeline avec mc.addFrameScript(frame, fonction())
    - un petit tableau pour mes frames-clefs (une anim ou une diapo = un écran) et je gère facilement la navigation (gotoAndPlay(T[écrans++]) ).

    Et ça marche parfaitement. On peut même choisir sa vitesse d'affichage (FPS) pour chaque anim. Et le tout dans une seule timeline !

    Maintenant, j'ai juste un dernier tout petit problème (quand un programmeur se met à Flash, il bute sur des trucs tout cons ) :

    frame 1 : (début d'anim)
    (moyen quelconque pour sortir de la boucle)
    frame 10: gotoAndPlay(1)

    Mon problème : la frame 10 ne s'affiche pas dans la boucle (puisque le gotoAndPlay(1) est dans la frame 10, donc en enterFrame() ). J'ai juste 123456789123456789... et pas 10 !

    Or, je ne veux pas mettre mon script en frame 11 (elle a un stop() avec la diapo suivante), je veux juste pouvoir lancer mon retour une fois que 10 est affichée.
    Une sorte de onExitFrame(10) : gotoAndPlay(1).
    (sauf que, bien entendu, l'évènement onExitFrame() n'existe pas...)
    C'est possible ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2008, 11h07
  2. Réponses: 2
    Dernier message: 26/01/2008, 12h19
  3. Réponses: 4
    Dernier message: 13/01/2007, 18h35
  4. Réponses: 1
    Dernier message: 09/10/2006, 21h31
  5. changer les couleurs des frames
    Par jack_1981 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 08/12/2005, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo