0

计数后如何重置我的号码?我想要一个类似 onComplete 函数的东西。

描述
我的动画从当前位置前进 120 像素,然后飞离舞台。它在循环,在前进之前会悠悠球到底部。我不希望我的数字溜溜球或飞出舞台。我的数字每次计数必须向前移动 120 像素,然后返回。

替代文字 http://www.ashcraftband.com/myspace/videodnd/tweener___.jpg

NumbersView.as '代码有效,但如描述的那样混乱'

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(); 
   //Tweener.init();

            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(""); 
            //trace("$number = " + $number);
            for (var i:Number = 0; i < nums.length; i++) { 
                if (nums[i] == previousNums[i]) continue; 
                Tweener.removeTweens(_listItems[i]);    

                //newY:int = -numHeight;
    var newY:int = int(nums[i]) * -numHeight;
    trace("newY = " + newY);
                trace("currY = " + _listItems[i].y);

    /*----------------------PROBLEM AREA, RIGHT HERE------------------------*/
                //if (_listItems[i].y < 0) _listItems[i].y = numHeight;//
                //Tweener.addTween(_listItems[i], { y:newY, time:3 } );//
    Tweener.addTween(_listItems[i], { y:_listItems[i].y+newY, time:3 } );//
            } 
            previousNums = nums; 
        } 
    } 
} 

Tweener 示例
http://hosted.zeh.com.br/tweener/docs/en-us/parameters/onComplete.html

**哎呀!
//废话代码是注意不要使用它',不是针对任何人的代码的评论


DOCUMENT CLASS
Publish Settings/Flash/Settings 'Advanced ActionScript 3.0 Settings'/Document class:NumbersView

CLASS Symbol 70x1080, numbers 70x120
Library/'right-click' Properties/Class:NumberImage

4

2 回答 2

0

我能想到的最合乎逻辑的解决方案是扩展包含所有数字的图像,使其每端都有一个 9,即:在 8 之后,图像的顶端有一个 9,但在 0 之前还有一个 9,在图像的底部。

然后你只需要做一些测试来找出你的图像在它循环的每个点在舞台上的什么位置。您需要知道在图像的任一端显示一 9时它将处于的位置。然后,您只需输入一个 if 语句来测试对象何时到达该位置,这意味着它正在显示最顶部的 9,当它等于 true 时,使图像的位置等于最底部的 9。当您执行此更改时,不要使用Tweener,因为您希望它在一帧中向下捕捉到其他 9 个位置,因此观众不会意识到它。

希望你明白我在说什么。你的代码让我很困惑,所以我不太确定(不用花太长时间去理解它)你会把这个逻辑放在哪里,但我想你会知道的。

于 2010-03-17T20:13:37.103 回答
0

我花了一点时间才弄清楚你真正想要得到什么作为最终结果,但我想我明白了。我将此功能分为 2 个类。NumbersView 类仍然是文档类,但我还创建了一个 NumberImage 类,您可以将其附加到库中的 0-9 数字影片剪辑中。这是代码:

//NumbersView.as - Your Document Class
package {

    import flash.display.MovieClip;

    public class NumbersView extends MovieClip {

        private var _listItems:Array; 
        private const numHeight:int = 120; 

        public function NumbersView()  
        { 
            _listItems = 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); 
            }

            setTime('123456789');

        }

        public function setTime($number:String):void { 
            var nums:Array = $number.split(""); 
            trace(nums);

            for (var i:Number = 0; i < nums.length; i++) { 

                _listItems[i].start( int(nums[i]) );

            } 

        } 


    }
}

下一个类是 NumberImage.as 类,您可以通过右键单击库中的项目“Properties...”,选中“Export for ActionScript”,然后输入 NumberImage 作为类名来连接到您的影片剪辑。

//NumberImage.as - Linked to the NumberImage movieclip in the Library    
package {

    import flash.display.MovieClip;
    import caurina.transitions.Tweener;

    public class NumberImage extends MovieClip {

        public var count:int;

        public function NumberImage() {
            count = 0;
        }

        public function start( num:int = 0 ):void {
            this.y = -120*num;
            count = num;
            moveNumbers();
        }

        public function moveNumbers():void {
            count++;
            if(count % 10 == 0) {
                Tweener.addTween( this, {y: this.y + 1080, time:1, onComplete:moveNumbers});
            } else {
                Tweener.addTween( this, {y: this.y - 120, time:1, onComplete:moveNumbers});
            }
        }

    }
}

希望这更有意义,并且现在更容易破译 NumberImage 对象的功能是由它们自己而不是由它们的包含类处理的。

于 2010-03-17T20:23:05.317 回答