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