【问题标题】:Counter in Flash and Tweener as3Flash 和 Tweener as3 中的计数器
【发布时间】:2010-02-18 17:30:23
【问题描述】:

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

我在测试什么“NumbersView.as”
循环错误、onComplete、缺少参数或函数

- Tweener 代码,第 37 行?
- for 循环,第 22 行? for (var i:Number = 0; 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); 
  } 
 }
}

我已经调试好了!

【问题讨论】:

    标签: flash actionscript-3 arrays loops


    【解决方案1】:

    我注意到您的代码中有一些内容,因此我对其进行了编辑,它运行良好。

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

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

    数字文档类

    分离出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));
            }
        }
    }
    

    数字视图

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

    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,并使用此代码,那么它应该运行得非常好。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多