计数器在Flash和中间人AS3中间人、计数器、Flash

2023-09-08 15:33:35 作者:绿皮火车

我的滚动计数器不显示1-9 ......只有零每10个时间间隔。它可以播放,但code是未完成的在NumbersView.as线37。通知中间人用于显示精灵。我要如何完成这个?

我所测试NumbersView.as 环路误差,的onComplete,缺少的参数或功能 - 中间人code,行37 ? - 循环,22行?对于(VAR我:数量= 0; I< 9;我++)

感谢您的帮助!

numbers.fla

NumbersView.as 看向底部中间人一部分

 包
{
 进口flash.display.DisplayObject;
 进口的flash.display.MovieClip;
 进口flash.utils.Dictionary;
 进口对象类型:flash.events.Event;
 进口caurina.transitions.Tweener;


 公共类NumbersView扩展影片剪辑
 {

  私人VAR _listItems:阵列=新的Array();


  公共职能NumbersView()
  {
   VAR项目:NumberImage;
   对于(VAR我:数量= 0; I< 9;我++){
    项目=新NumberImage();
    的addChild(项目);
    item.x = I * item.width;
    _listItems.push(项目);
   }

  }


  公共职能的setTime($编号:字符串):无效{
   VAR NUMS:阵列= $ number.split();
   对于(VAR我:数量= 0; I< nums.length;我++){
    如果(INT(NUMS [I])== 0){
     Tweener.removeTweens(_listItems [I] .moveableNumber_mc);
     如果(_listItems [I] .moveableNumber_mc.y℃,){
      _listItems [I] .moveableNumber_mc.y = 120;
     }
     Tweener.addTween(_listItems [I] .moveableNumber_mc,{Y:0,时间:0.3});
    } 其他 {
     Tweener.addTween(_listItems [I] .moveableNumber_mc,{Y:-120 * INT(NUMS [I]),时间:0.3});
    }
   }
  }
 }

}
 

NumberDocumentClass.as 工作正常

 包{
 进口flash.display.Sprite;
 进口flash.utils.Timer;
 进口flash.events.TimerEvent;

 公共类NumberDocumentClass扩展Sprite {

  私人VAR定时器:定时器=新的定时器(10);
  私人VAR计数:= 0;
  私人VAR FCOUNT:= 0;
  私人VAR数字:NumbersView;

  公共职能NumberDocumentClass(){
   timer.addEventListener(TimerEvent.TIMER,incrementCounter);
   timer.start();
   数=新NumbersView();
   的addChild(数字);
  }

  功能incrementCounter(事件:TimerEvent){
   算上++;
   FCOUNT = INT(计数*计数/ 1000); //开始时慢......然后加速
   numbers.setTime(formatCount(FCOUNT));
  }

  功能formatCount(I:INT):字符串{
   返回(000000000+ I).substr(-9,9);
  }
 }
}
 

我知道了调试! 解决方案

我注意到在你的code的几件事情,所以我编辑它,它工作正常。

主要的问题是,你Flash库项目(MC-NumberImage)没有被设置为你使用它的方式。你把帧数的图形,所以我修改了它,因此影片剪辑有一帧与彼此顶部所有的数字。因此, number_0.y = 0 和 number_1.y = 120 ... number_2.y = 240 等。(也是在你的图书馆你的number_8.jpg实际上是一个数字7)。

在Flash鼠绘时玩转

如果你只是做出的改变那么你的code运行时的确定的。它变得越来越慢,但。这部分是由于中间人,但主要是因为它正试图更新太多。我更新你低于code。

NumberDocumentClass

分离出的 incrementCounter 的,并且显示code。所以,现在的 numbers.setTime()的被调用上的 enterframe 的(不点绘制超过一次架,Flash无法做到这一点)。我也开始在构造函数中的计时器,而不是在变量声明(这是最好的做法)。

 包{
    进口flash.display.Sprite;
    进口对象类型:flash.events.Event;
    进口flash.utils.Timer;
    进口flash.events.TimerEvent;

    公共类NumberDocumentClass扩展Sprite {

        私人VAR定时器:定时器;
        私人VAR计数:= 0;
        私人VAR FCOUNT:= 0;
        私人VAR数字:NumbersView;

        公共职能NumberDocumentClass(){
            定时器=新的定时器(10);
            timer.addEventListener(TimerEvent.TIMER,incrementCounter);
            timer.start();
            数=新NumbersView();
            的addChild(数字);

            的addEventListener(Event.ENTER_FRAME,enterFrameHandler);
        }

        私有函数incrementCounter(事件:TimerEvent){
            算上++;
            FCOUNT = INT(计数*计数/ 1000); //开始时慢......然后加速
        }

        私有函数formatCount(I:INT):字符串{
            返回(000000000+ I).substr(-9,9);
        }

        私有函数enterFrameHandler(五:事件):无效
        {
            numbers.setTime(formatCount(FCOUNT));
        }
    }
}
 

NumberView

我主要是编辑的setTime方法。我加了previousNums变量,记得previous号码,这样,我们可以用它来看看一些改变了,如果还没有,那么你可以跳过它(的如果(NUMS [我] == previousNums [I])继续; 的)

 包
{
    进口flash.display.DisplayObject;
    进口的flash.display.MovieClip;
    进口flash.utils.Dictionary;
    进口对象类型:flash.events.Event;
    进口caurina.transitions.Tweener;

    公共类NumbersView扩展影片剪辑
    {
        私人VAR _listItems:阵列;
        私人变种previousNums:阵列;
        私人常量numHeight:INT = 120;

        公共职能NumbersView()
        {
            _listItems =新的Array();
            previousNums =新的Array();

            VAR项目:NumberImage;
            对于(VAR我:数量= 0; I< 9;我++){
                项目=新NumberImage();
                的addChild(项目);
                item.x = I * item.width;
                _listItems.push(项目);
            }
        }

        公共职能的setTime($编号:字符串):无效{
            VAR NUMS:阵列= $ number.split();

            对于(VAR我:数量= 0; I< nums.length;我++){
                如果(NUMS [我] == previousNums [I])继续;
                Tweener.removeTweens(_listItems [I]);

                VAR newY:INT = INT(NUMS [I])* -numHeight;
                如果(_listItems [I] .Y℃下)_listItems [Ⅰ] .Y = numHeight;
                Tweener.addTween(_listItems [I],{Y:newY,时间:.1});
            }
            previousNums = NUM​​S;
        }
    }
}
 

所以,如果你设置你的FLA用数字图像垂直对齐,并使用这个code,那么它应该运行得很好。

My scrolling counter is not displaying 1-9...only "zeros" every ten intervals. It plays, but the code is unfinished at line 37 in NumbersView.as. Notice Tweener is used to display the sprites. How do I finish this?

WHAT I'M TESTING "NumbersView.as" loop error, onComplete, missing argument or function - Tweener code, line 37? - for loop, line 22? for (var i:Number = 0; i < 9; i++)

Thanks for the help!

numbers.fla

NumbersView.as "see Tweener part towards the bottom"

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 "works fine"

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

I got it debugged!

解决方案

I noticed a few things in your code, so I edited it and it works fine.

The main problem is that you Flash library item (mc-NumberImage) wasn't set up for the way you were using it. You put the number graphics on frames, so I modified it so the movieclip has one frame with all the numbers on top of each other. So number_0.y = 0, and number_1.y = 120... number_2.y = 240, etc. (also In your library your "number_8.jpg" is actually a number 7).

If you just make that change then your code runs OK. It does get slower and slower though. This is partly due to Tweener, but mostly because it is trying to update too much. I updated you code below.

NumberDocumentClass

Separated out the incrementCounter, and the display code. So now numbers.setTime() gets called on enterframe (no point drawing more than once a frame, Flash can't do it). I also initiated your Timer in the constructor rather than in the variable declaration (this is best practice).

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

I mainly edited the setTime method. I added a previousNums variable that remembers the previous numbers, that way we can use it to see if a number has changed, and if it hasn't then you can skip it (if(nums[i] == previousNums[i]) continue;).

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

So if you set up your FLA with the number graphics aligned vertically, and you use this code, then it should run really well.