2010-03-17 5 views
0

Je souhaite que mon animation avance de 120 pixels à chaque fois. Au lieu de cela, mon animation retourne au fond, plutôt que d'avancer à partir de sa nouvelle position. Il assume une nouvelle position, mais retourne toujours en bas en premier. Comment puis-je faire avancer l'animation à partir de sa position actuelle à chaque fois?Avance depuis la position actuelle, Tweener, AS3

BUT
Je veux que mon animation pour faire avancer 120 pixels de la position actuelle nouvelle, et répétez après dix.

PROBLEME
réinitialisations d'animation en bas à chaque fois, avant d'avancer. Je ne sais pas si c'est un problème de Tweener, comment j'ai mis en place ma boucle, ou quelque chose sans rapport. Si vous pouvez me donner un exemple de la façon de modifier ce code, je serais reconnaissant.

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);     
       if (_listItems[i].y < 0) _listItems[i].y = numHeight; 
       Tweener.addTween(_listItems[i], { y:newY, time:3 }); 
      } 
      previousNums = nums; 
     } 
    } 
} 

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

Tweener http://hosted.zeh.com.br/tweener/docs/en-us/

Répondre

0

J'étais genre de capable d'obtenir votre code pour animer des objets et j'ai vu que chaque fois que le ems animé ils redémarrés à leur position, voici ce que j'ai changé pour les amener à se déplacer de là où ils sont actuellement positionnés:

d'origine:

if (_listItems[i].y < 0) _listItems[i].y = numHeight; 
Tweener.addTween(_listItems[i], { y:newY, time:3 }); 

changé à:

//if (_listItems[i].y < 0) _listItems[i].y = numHeight; //get rid of this line 
Tweener.addTween(_listItems[i], { y:_listItems[i].y+newY, time:3 }); 

Pour la partie en boucle de ce que vous pouvez utiliser une minuterie, voici ce que j'ai mis ensemble comme un exemple pour vous. Ce n'est probablement pas parfait, mais j'espère que vous aurez une idée de ce que vous voulez qu'il fasse:

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

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

    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); 
     } 

     t = new Timer(1000) //1000ms = 1 second intervals 
     t.addEventListener(TimerEvent.TIMER, onTimer); 
     t.start(); 

    } 

    public function onTimer(e:TimerEvent):void { 

     //this will run every 10th time firing 
     if(t.currentCount % 10 == 0) { 
      //do something to reset the listItems 
      for (var i:Number = 0; i < _listItems.length; i++) { 
       _listItems[i].y = numHeight; 
      } 
     } 

     //do your setTime function, I just randomly called it with random numbers 
     setTime(Math.round(Math.random()*234567).toString()); 
    } 

    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);     

      Tweener.addTween(_listItems[i], { y:_listItems[i].y+newY, time:3 }); 
     } 
     previousNums = nums; 
    } 
} 
} 
+0

Répond au problème de Tweener! Toute idée comment l'avoir en boucle. Je ne pense pas que c'était clair dans ma question –

+0

Vous pouvez utiliser le paramètre onComplete pour truquer un type de récursion dans votre tween en passant la position de départ dans la fonction que vous utilisez pour lancer votre interpolation, puis la mettre à jour avec le position attendue après que l'interpolation ait été complétée. – vanhornRF

+0

Merci, je vais essayer ça. –

Questions connexes