2010-03-17 14 views
0

Comment réinitialiser mes numéros après leur comptage? Je veux quelque chose comme une fonction onComplete.reset, Tweener, AS3

DESCRIPTION
Mon animation avance 120 pixels à partir de sa position actuelle, puis vole hors de la scène. Il était en boucle, et yoyo au fond avant d'avancer. Je ne veux pas de mes numéros ou de quitter la scène. Mes numéros doivent se déplacer de 120 pixels vers l'avant chaque compte, puis retour .

alt text http://www.ashcraftband.com/myspace/videodnd/tweener___.jpg

NumbersView.as 'le code fonctionne, mais dans un foiré comme décrit'

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.MovieClip; 
    import flash.utils.Dictionary; 
    import flash.events.Event; 
    import caurina.transitions.Tweener; 

    public class NumbersView extends MovieClip 
    { 
     private var _listItems:Array; 
     private var previousNums:Array; 
     private const numHeight:int = 120; 

     public function NumbersView() 
     { 
      _listItems = new Array(); 
      previousNums = new Array(); 
    //Tweener.init(); 

      var item:NumberImage; 
      for (var i:Number = 0; i < 9; i++) { 
       item = new NumberImage(); 
       addChild(item); 
       item.x = i * item.width; 
       _listItems.push(item); 
      } 
     } 

     public function setTime($number:String):void { 
      var nums:Array = $number.split(""); 
      //trace("$number = " + $number); 
      for (var i:Number = 0; i < nums.length; i++) { 
       if (nums[i] == previousNums[i]) continue; 
       Tweener.removeTweens(_listItems[i]);  

       //newY:int = -numHeight; 
    var newY:int = int(nums[i]) * -numHeight; 
    trace("newY = " + newY); 
       trace("currY = " + _listItems[i].y); 

    /*----------------------PROBLEM AREA, RIGHT HERE------------------------*/ 
       //if (_listItems[i].y < 0) _listItems[i].y = numHeight;// 
       //Tweener.addTween(_listItems[i], { y:newY, time:3 });// 
    Tweener.addTween(_listItems[i], { y:_listItems[i].y+newY, time:3 });// 
      } 
      previousNums = nums; 
     } 
    } 
} 

Tweener Exemple
http://hosted.zeh.com.br/tweener/docs/en-us/parameters/onComplete.html

** oopse!
// code merde était l acte de ne pas utiliser ce, pas un commentaire contre le code de quelqu'un


DOCUMENT DE CLASSE
Paramètres de publication/Flash/Paramètres ActionScript Avancé 3.0 Réglages '/classe document: NumbersView

cLASSE Symbole 70x1080, numéros 70x120
Bibliothèque/« clic droit sur » Propriétés/Classe: NumberImage

+0

Est-ce que je ne vous ai pas déjà envoyé un code qui a fait * exactement * ça? Dans l'exemple que je vous ai donné, les chiffres sont remis à zéro après 9; Cela a été fait différemment de ce que vous avez ici, mais c'était beaucoup moins complexe aussi. – debu

+0

Le document NumbersView me donnait des problèmes, mais je ne l'ai pas regardé de manière critique. J'ai tout fonctionne sauf mes préadolescents. –

Répondre

0

Il m'a fallu un peu de temps pour comprendre ce que vous essayez vraiment d'obtenir comme résultat final, mais je pense que je l'ai compris. J'ai divisé cette fonctionnalité en 2 classes. La classe NumbersView est toujours la classe de document, mais j'ai également créé une classe NumberImage que vous pouvez attacher à vos MovieClips 0-9 dans votre bibliothèque.Voici le code:

//NumbersView.as - Your Document Class 
package { 

    import flash.display.MovieClip; 

    public class NumbersView extends MovieClip { 

     private var _listItems:Array; 
     private const numHeight:int = 120; 

     public function NumbersView() 
     { 
      _listItems = new Array(); 

      var item:NumberImage; 
      for (var i:Number = 0; i < 9; i++) { 
       item = new NumberImage(); 
       addChild(item); 
       item.x = i * item.width; 
       _listItems.push(item); 
      } 

      setTime('123456789'); 

     } 

     public function setTime($number:String):void { 
      var nums:Array = $number.split(""); 
      trace(nums); 

      for (var i:Number = 0; i < nums.length; i++) { 

       _listItems[i].start(int(nums[i])); 

      } 

     } 


    } 
} 

La classe suivante est la classe NumberImage.as que vous pouvez brancher à votre movieclip par un clic droit l'élément dans la bibliothèque, « Propriétés ... », cochez la case « Exporter pour ActionScript ", et mettre NumberImage pour le nom de la classe.

//NumberImage.as - Linked to the NumberImage movieclip in the Library  
package { 

    import flash.display.MovieClip; 
    import caurina.transitions.Tweener; 

    public class NumberImage extends MovieClip { 

     public var count:int; 

     public function NumberImage() { 
      count = 0; 
     } 

     public function start(num:int = 0):void { 
      this.y = -120*num; 
      count = num; 
      moveNumbers(); 
     } 

     public function moveNumbers():void { 
      count++; 
      if(count % 10 == 0) { 
       Tweener.addTween(this, {y: this.y + 1080, time:1, onComplete:moveNumbers}); 
      } else { 
       Tweener.addTween(this, {y: this.y - 120, time:1, onComplete:moveNumbers}); 
      } 
     } 

    } 
} 

Espérons que cela a plus de sens et il est plus facile de déchiffrer maintenant que la fonctionnalité des objets NumberImage sont gérés par eux-mêmes plutôt que par leur classe contenant.

+0

En outre, merci pour l'aide avec le XML. –

+0

Bonne idée. Les cours sont bien préparés. Ya m'a fait réfléchir! Quoi qu'il en soit, la 'classe de document' avance, et 'classe' fait défiler les nombres. Mes animations devront prolonger mes cours pour des mouvements complexes. Merci. –

0

La solution la plus logique, je peux penser à du haut de ma tête est d'étendre l'image qui contient tous vos numéros de sorte qu'il a un 9 à chaque extrémité, c'est-à-dire: après le 8 il y a un 9 à l'extrémité supérieure de l'image, mais avant le 0 il y a aussi un 9, en bas de l'image.

Ensuite, vous avez juste besoin de faire quelques tests pour savoir quelles positions sur la scène votre image sera à chaque point de son cycle. Vous devez connaître la position dans laquelle il se trouve lorsque vous affichez soit des 9, à chaque extrémité de l'image. Ensuite, vous mettez simplement une instruction if à tester lorsque l'objet atteint la position, ce qui signifie qu'il affiche le 9 le plus haut, et lorsque cela est vrai, placez la position de l'image au niveau le plus bas. 9. Lorsque vous faites ce changement , n'utilisez pas Tweener, comme vous voulez qu'il se fixe à l'autre 9 position dans une image, de sorte que le spectateur ne soit pas au courant.

J'espère que vous voyez ce que je dis. Votre code me déroute, donc je ne suis pas vraiment sûr (sans passer trop de temps à essayer de le comprendre) où vous mettriez cette logique, mais je suppose que vous le sauriez.