多个动态文本分数显示。逐个修改每个文本并将分数增加一定数量

时间:2011-02-23 20:29:59

标签: actionscript-3 flash-cs5

我有一个结果屏幕,显示奖励积分等。我希望每个文本字段一个接一个地递增,并且每帧增加一定量。

弹出结果屏幕。

首先是球员得分 检查玩家得分,是否超过我们想要显示的分数

如果玩家得分大于玩家显示得分100 将玩家显示分数提高100

如果玩家得分大于玩家显示得分10 将玩家显示得分提高10点

否则将玩家显示分数提高1

完成后移动到下一个分数......依此类推。

我曾想过使用计时器从一个分数移动到下一个分数,但不是在一个Event.ENTER_FRAME中它只有一个,如果然后移动到下一个。用于递增分数的if语句看起来很荒谬,我认为必须有更好的方法来做到这一点。我想把它作为一个单独的功能,但后来我不知道该返回什么,或者如何返回它所以它看起来像它的增加而不仅仅是立即显示总数。

如果您有任何疑问,请发表评论。我会尝试进一步扩展它。

1 个答案:

答案 0 :(得分:0)

您可以创建一个继承自TextField的新ScoreText类,并将其用于每个得分文本字段。在该类上,您可以创建一个取得分数的setTargetScore方法,并处理显示数量的增量。然后它可以在完成时发送一个事件。您可以监听当时的事件,并根据需要在每个ScoreText上调用setTargetScore方法。

另一种可能更好/更容易的方法是使用TweenLite补间您的分数,并使用其事件更新分数文本字段,并在完成时移动到下一个。

修改*

以下是使用Tweenlite补间得分变量的示例: How to Tween A Variable with Flash and TweenLite

<强> EDIT2 *

以下是我的第一个方法示例:

首先是ScoreText类:

package {
    import flash.events.Event;
    import flash.text.TextField;

    public class ScoreText extends TextField {
        public static const EVENT_SCORE_COMPLETE:String = 'scoreCompleteEvent';

        private var targetScore:Number = 0;
        private var currentScore:Number = 0;
        private const speed:Number = 0.11;

        public function ScoreText(initialScore:Number = 0) {
            currentScore = initialScore;
            updateScore();
        }

        public function setTargetScore(targetScore:Number):void {
            this.targetScore = targetScore;
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }

        private function enterFrameHandler(e:Event):void {
            currentScore += (targetScore - currentScore) * speed;

            if (currentScore >= targetScore -1) {
                removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                dispatchEvent(new Event(EVENT_SCORE_COMPLETE));
            }

            updateScore();
        }

        private function updateScore():void {
            this.text = Math.round(currentScore).toString();
        }
    }
}

这是Main class:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite 
    {
        private var st1:ScoreText;
        private var st2:ScoreText;
        private var st3:ScoreText;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            st1 = new ScoreText(0);
            st1.y = 10;
            st1.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score1Complete);
            addChild(st1);

            st2 = new ScoreText(0);
            st2.y = 60;
            st2.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score2Complete);
            addChild(st2);

            st3 = new ScoreText(0);
            st3.y = 110;
            st3.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score3Complete);
            addChild(st3);

            st1.setTargetScore(1234);
        }

        private function score1Complete(e:Event):void 
        {
            trace('score 1 finishes, start the next one!');
            st2.setTargetScore(234553);
        }

        private function score2Complete(e:Event):void 
        {
            trace('score 2 finishes, start the next one!');
            st3.setTargetScore(745);
        }

        private function score3Complete(e:Event):void 
        {
            trace('score 3 finishes, start the next one!');
        }
    }
}