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 :

Problème méthode Tween()


Sujet :

ActionScript 3

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [résolu] Problème méthode Tween()
    Salut à tous,

    aprés avoir, vainement, chercher une solution à mon problème je me suis résoud à demander un petit coup de main.

    Comme le titre l'indique le souci vient de la méthode Tween (pour déplacer un clip vers un clic gauche de la souris).

    Lorsque je clique sur le fond, mon clip "me" se déplace vers ce point. Il s'arrête (méthode Stop() ) s'il heurte le symbole "Caillou 1". Si on attends les 5s qui signale la fin du mouvement (60 images à 12fps) on peut repartir sans soucis. Par contre si on change de direction pour volontairement heurter le caillou avant que le mouvement initial ne soit fini là mon soucis voit le jour. Mon clip garde en mémoire le Tween malgrés l'appel à la méthode Stop(). Ainsi, juste aprés le choc il se déplace depuis la position qu'il avait lorsqu'on a changé de direction vers son ancien objectif.

    Voici mon code en AS3

    import fl.transitions.*;
    import fl.transitions.easing.*;

    var tempo1:Number;
    var chocpasse:Boolean;
    var mouvementx:Tween;
    var mouvementy:Tween;


    fond.addEventListener(MouseEvent.MOUSE_DOWN,deplacer);
    but_att.addEventListener(MouseEvent.MOUSE_DOWN,attaquer);
    //Because this is AS3 everything needs to be called through
    //eventlisteners, so this first lin calls and listens for the clip
    me.addEventListener(Event.ENTER_FRAME, stopTweens);

    //here is our function, it is called at the beginning of the movie
    function stopTweens(event:Event):void{

    if (me.hitTestObject(Caillou1) && chocpasse==false) {
    chocpasse = true;
    mouvementx.stop();
    mouvementy.stop();
    //Ci aprés, 2 linstructions pour palier à un soucis: éviter de rester bloquer sur le caillou!
    mouvementx.prevFrame();
    mouvementy.prevFrame();
    tempo1 = setInterval(afficher, 0);
    }

    }

    function deplacer(evt:MouseEvent) {
    clearInterval(tempo1);
    this.but_att.visible = false;
    if(chocpasse == true){
    chocpasse=false;
    }
    mouvementx = new Tween(me,"x", Regular.easeOut, me.x, mouseX, 60, false);
    mouvementy = new Tween(me,"y", Regular.easeOut, me.y, mouseY, 60, false);
    tempo1 = setInterval(afficher, 5000);
    }

    function attaquer(evt:MouseEvent) {
    attaque.x=me.x+20;
    attaque.y=me.y+20;
    }


    function afficher(){
    this.but_att.visible = true;
    clearInterval(tempo1);
    }

    Voilà si jamais quelqu'un peut éclairer ma lanterne je lui en serais reconnaissant

    Ica

  2. #2
    Membre régulier Avatar de Lideln75
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 111
    Points : 102
    Points
    102
    Par défaut
    Hello,

    Je n'ai pas testé ton problème, mais je pense avoir une piste pour toi.
    Dans ta fonction "deplacer" (c'est quoi ces gens qui mettent leurs fonctions en français, j'ai jamais compris ), tu fais tout un tas de choses, DONT créer les deux tweens. Le seul souci que je pense possible (mais je ne sais pas comment Flash gère ça en interne) c'est qu'en associant un tween à un objet, le seul moyen de le virer est de le "désassocier".

    En fait je m'explique : tu veux qu'on puisse cliquer à un autre endroit et se déplacer même si on est déjà en mouvement (donc 2 tweens déjà existants). On appelle alors la fonction "deplacer", qui crée deux nouveaux tweens !!

    Je pense que (peut-être, vu que je connais pas les tweens et que j'ai pas testé) un moyen de corriger ton bug serait, dans la fonction "deplacer", de tester les tweens pour savoir s'ils sont nulls. S'ils ne le sont pas, tu les stoppe, tu les désassocient du DisplayObject (si jamais il y a une fonction pour ça), ensuite éventuellement tu les mets à null (inutile je pense mais je trouve ça plus parlant) et hop ensuite seulement tu crées les nouveaux tweens !

    Et n'oublie pas une règle qui vient du C/C++ (mais je ne sais pas comment Flash gère en interne) : TOUJOURS initialiser ses variables, afin qu'elles aient à tout moment une valeur connue.

    Voilà, dis-moi si ça corrige le souci.

    A+

  3. #3
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut,

    je vais tenter de suivre tes conseils, j'étais parti vers cette optique mais j'ai zappé une ou deux étapes ^_^. Je reviendrais donner suite une fois le test validé (de préférence) ou pas...

    Sinon pour les fonctions en français c'est parce que c'est un premier jet souvent plus parlant pour nous autres français. Et au moins ça évite tout conflit de mot clef

    Pour les initialisations de variables je ne pense pas que ça gène du moment où je ne me sers jamais de la valeur par défaut^^ C'est magique les variables quand on ne soucis pas de la place qu'elles occupent

    Allez @+

  4. #4
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut,

    je ne réponds que maintenant car je n'ai pas pu me replonger dans ce projet pendant un moment (et aussi parce qu'il m'a bien pris la tête ).

    Sinon voilà comment j'ai procéder:
    pour supprimer un mouvement, j'ai supprimé le clip qui se déplace ainsi plus de soucis avec des résidus d'anciens mouvements.
    Ensuite pour relancer un mouvement je recrée un clip ^^

    Si certains souhaitent plus d'explications n'hésitez pas à demander. Je mets quand même mon code (sans commentaires, je me suis énervé dessus ).

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import fl.transitions.Tween;
    import fl.transitions.TweenEvent;
    import fl.transitions.easing.*;
    import flash.display.MovieClip;
     
    var tempo1:Number;
    var chocPasse:Boolean = false;
    var mouvementx:Tween; 
    var mouvementy:Tween; 
    var me:sphere = new sphere();
    var me2:sphere = new sphere();
    var x_mem=50;
    var y_mem=50;
     
    trace('creation du premier enfant');
    		fond.addChild(me);
    		me.x=50;
    		me.y=50;
    		me2.x=50;
    		me2.y=50;
     
    me.addEventListener(Event.ENTER_FRAME, stopTweens); 
    fond.addEventListener(MouseEvent.MOUSE_DOWN,deplacer);
    but_att.addEventListener(MouseEvent.MOUSE_DOWN,attaquer);
     
     
    function stopTweens(event:Event):void{
     
        if (me.hitTestObject(Caillou1) && !chocPasse) {
    		mouvementx.prevFrame();
    		mouvementy.prevFrame();
    		mouvementx.stop();
    		mouvementy.stop();
     
    			trace('suppresion de me');
    			x_mem=me.x;
    			y_mem=me.y;
    			for(var i=1;i<fond.numChildren;i++){
    				fond.removeChildAt(i);
    				trace('enfant suppr: '+i);
    			}
    			fond.addChild(me2);
    			me2.x=x_mem;
    			me2.y=y_mem;
     
    		tempo1 = setInterval(afficher, 0);
    		chocPasse=true;
    	}
     
    }
     
     
    function deplacer(evt:MouseEvent) {
    	this.but_att.visible = false;
    	clearInterval(tempo1);
    	tempo1 = setInterval(afficher, 5000);
     
    	trace('suppression de me2');
    	if(chocPasse){
    		x_mem=me2.x;
    		y_mem=me2.y;
    	}
    	else{
    		x_mem=me.x;
    		y_mem=me.y
    	}
    	for(var i=1;i<fond.numChildren;i++){
    		fond.removeChildAt(i);
    		trace('enfant suppr: '+i);
    	}
    	fond.addChild(me);
    	me.x=x_mem;
    	me.y=y_mem;
     
    	mouvementx = new Tween(me,"x", Regular.easeOut, me.x, mouseX, 60, false);
    	mouvementy = new Tween(me,"y", Regular.easeOut, me.y, mouseY, 60, false);
    	mouvementx.start();
    	mouvementy.start();
    	chocPasse=false;
    }
     
    function attaquer(evt:MouseEvent) {
    	attaque.x=me.x+20;
    	attaque.y=me.y+20;
    }
     
     
    function afficher(){
    	this.but_att.visible = true;
    	clearInterval(tempo1);
    }
    ps: la classe sphere est crée dans les propriétés du clip voulu depuis la bibliothèque.

    Ica

Discussions similaires

  1. problème de tween
    Par tidji dans le forum Flash
    Réponses: 2
    Dernier message: 23/03/2007, 16h23
  2. VBA-E Problème méthode .find
    Par popo68 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2007, 10h14
  3. [EJB2.1 Entity] Problème méthode findAll() avec Jonas 4.7.4
    Par mixouille dans le forum Java EE
    Réponses: 1
    Dernier message: 28/07/2006, 12h06
  4. Problème méthode NUM
    Par Pfeffer dans le forum 4D
    Réponses: 2
    Dernier message: 10/07/2006, 09h17

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