Flash和Tweener as3中的计数器

时间:2010-02-18 17:30:24

标签: flash actionscript-3 arrays loops

我的滚动计数器不显示1-9 ...每十个间隔只显示“0”。它播放,但代码在NumbersView.as的第37行未完成。注意Tweener用于显示精灵。我该如何完成?

我正在测试“NumbersView.as”
循环错误,onComplete,缺少参数或功能

- Tweener代码,第37行?
- for循环,第22行? for(var i:Number = 0; i< 9; i ++)


谢谢你的帮助!

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

numbers.fla

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

NumbersView.as “请参见底部的Tweener部分”

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 = new Array();


  public function NumbersView() 
  {
   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("");
   for (var i:Number = 0; i < nums.length; i++) {
    if (int(nums[i]) == 0) {
     Tweener.removeTweens(_listItems[i].moveableNumber_mc);
     if (_listItems[i].moveableNumber_mc.y < 0) {
      _listItems[i].moveableNumber_mc.y = 120;
     }
     Tweener.addTween(_listItems[i].moveableNumber_mc, { y: 0, time:.3 } );
    } else {
     Tweener.addTween(_listItems[i].moveableNumber_mc, { y: -120 * int(nums[i]), time:.3} );
    }
   }
  }
 }

}

NumberDocumentClass.as “工作正常”

package {
 import flash.display.Sprite;
 import flash.utils.Timer;
 import flash.events.TimerEvent;

 public class NumberDocumentClass extends Sprite {

  private var timer:Timer = new Timer(10);
  private var count:int = 0;
  private var fcount:int = 0;
  private var numbers:NumbersView;

  public function NumberDocumentClass() {
   timer.addEventListener(TimerEvent.TIMER, incrementCounter);    
   timer.start();   
   numbers = new NumbersView();
   addChild(numbers);
  }

  function incrementCounter(event:TimerEvent) {    
   count++;    
   fcount=int(count*count/1000);//starts out slow... then speeds up   
   numbers.setTime(formatCount(fcount));
  }  

  function formatCount(i:int):String {   
   return ("000000000" + i).substr(-9, 9); 
  } 
 }
}

我调试了它!

1 个答案:

答案 0 :(得分:0)

我注意到你的代码中有一些东西,所以我编辑了它,它运行正常。

主要问题是您的Flash库项目(mc-NumberImage)没有按照您使用它的方式设置。你把数字图形放在帧上,所以我修改了它,所以movieclip有一个帧,所有的数字都在彼此的顶部。所以 number_0.y = 0 number_1.y = 120 ... number_2.y = 240 等等(也在您的图书馆中)你的“number_8.jpg”实际上是一个数字7)。

如果您只是进行了更改,那么您的代码将运行确定。它确实变得越来越慢。这部分是由于Tweener,但主要是因为它试图更新太多。我在下面更新了你的代码。

NumberDocumentClass

分离出 incrementCounter 和显示代码。所以现在 numbers.setTime() enterframe 上被调用(没有一点多次绘制一帧,Flash无法做到)。我还在构造函数中启动了Timer,而不是在变量声明中(这是最佳实践)。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    public class NumberDocumentClass extends Sprite {

        private var timer:Timer;
        private var count:int = 0;
        private var fcount:int = 0;
        private var numbers:NumbersView;

        public function NumberDocumentClass() {
            timer = new Timer(10);
            timer.addEventListener(TimerEvent.TIMER, incrementCounter);    
            timer.start();   
            numbers = new NumbersView();
            addChild(numbers);

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }

        private function incrementCounter(event:TimerEvent) {    
            count++;    
            fcount=int(count*count/1000);//starts out slow... then speeds up
        }

        private function formatCount(i:int):String {   
            return ("000000000" + i).substr(-9, 9);
        }

        private function enterFrameHandler(e:Event):void 
        {
            numbers.setTime(formatCount(fcount));
        }
    }
}

NumberView

我主要编辑了setTime方法。我添加了一个记住之前数字的previousNums变量,这样我们可以用它来查看数字是否已经改变,如果没有,那么你可以跳过它( if(nums [i] == previousNums [我]继续; )。

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

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

            for (var i:Number = 0; i < nums.length; i++) {
                if (nums[i] == previousNums[i]) continue;
                Tweener.removeTweens(_listItems[i]);

                var newY:int = int(nums[i]) * -numHeight;
                if (_listItems[i].y < 0) _listItems[i].y = numHeight;
                Tweener.addTween(_listItems[i], { y:newY, time:.1 } );
            }
            previousNums = nums;
        }
    }
}

因此,如果您使用垂直对齐的数字图形设置FLA,并且使用此代码,那么它应该运行得非常好。