Счетчик во Flash и Tweener as3 - PullRequest
0 голосов
/ 18 февраля 2010

Мой счетчик прокрутки не отображает 1-9 ... только «нули» каждые десять интервалов. Это играет, но код незавершен в строке 37 в NumbersView.as. Обратите внимание, что Tweener используется для отображения спрайтов. Как мне это закончить?

Что я тестирую"NumbersView.as"
ошибка цикла, onComplete, отсутствует аргумент или функция

- Код Tweener, строка 37?
- для цикла, строка 22? для (var i: Number = 0; i <9; i ++) <br>


Спасибо за помощь!

альтернативный текст http://www.ashcraftband.com/myspace/videodnd/note3.jpg

numbers.fla

альтернативный текст http://www.ashcraftband.com/myspace/videodnd/note1.jpg альтернативный текст 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 голосов
/ 18 февраля 2010

Я заметил несколько вещей в вашем коде, поэтому я отредактировал его, и он отлично работает.

Основная проблема в том, что ваш элемент библиотеки Flash (mc-NumberImage) не был настроен так, как вы его использовали. Вы помещаете графику с цифрами в кадры, поэтому я изменил ее, чтобы у мувиклипа был один кадр со всеми числами друг над другом. Так что number_0.y = 0 и number_1.y = 120 ... number_2.y = 240 и т. Д. (Также в вашей библиотеке ваш "number_8" .jpg "на самом деле номер 7).

Если вы просто внесете это изменение, тогда ваш код выполнит OK . Это становится все медленнее и медленнее, хотя. Это отчасти связано с Tweener, но в основном потому, что он пытается обновить слишком много. Я обновил ваш код ниже.

NumberDocumentClass

Отделил incrementCounter и код дисплея. Так что теперь numbers.setTime () вызывается на enterframe (нет рисования точек более одного раза в кадре, Flash не может этого сделать). Я также инициировал ваш таймер в конструкторе, а не в объявлении переменной (это лучшая практика).

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 с графикой чисел, выровненной по вертикали, и использовали этот код, то он должен работать очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...