Несколько динамических текстовых показателей отображения.Изменяя каждый текст один за другим и увеличивая счет на определенное число - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть экран результатов, который показывает бонусные баллы и тому подобное.Я хочу, чтобы каждое текстовое поле увеличивалось одно за другим, а также увеличивало его на определенную величину в каждом кадре.

Появляется экран результатов.

Сначала проверяется счет игрока, проверяется счет игрока,это больше, чем оценка, которую мы хотим отобразить

, если оценка игрока больше, чем оценка дисплея игрока на 100, увеличьте оценку дисплея игрока на 100

, если оценка игрока больше, чем у игрокаотображаемая оценка на 10 увеличивает отображаемую оценку игрока на 10

, иначе увеличивает отображаемую оценку игрока на 1

, когда закончите, переходите к следующей оценке ... и т. д.

Я думал об использовании таймеров для перехода от одного счета к другому, но не в Event.ENTER_FRAME он делает только один, если затем переходит к следующему.Кроме того, выражение if для увеличения оценки выглядит нелепо, и я думаю, что должен быть лучший способ сделать это.Я думал о том, чтобы сделать его отдельной функцией, но тогда я не знал бы, что вернуть, или как вернуть его, чтобы это выглядело как увеличение, а не просто отображение общего числа мгновенно.

Если у вас есть какие-либовопросы, пожалуйста, оставьте комментарий.Я постараюсь рассказать об этом немного подробнее.

1 Ответ

0 голосов
/ 24 февраля 2011

Вы можете создать новый класс ScoreText, который наследуется от TextField, и использовать его для каждого из ваших текстовых полей оценки. В этом классе вы могли бы создать метод setTargetScore, который принимает число баллов и обрабатывает увеличение отображаемого числа. Тогда это могло бы послать событие, когда это закончено. Затем вы можете прослушивать события и вызывать метод setTargetScore для каждого ScoreText, как вам нужно.

Другой способ, который, возможно, лучше / проще, - использовать TweenLite для анимации числа вашего счета и использовать его события для обновления текстового поля счета, а после его завершения перейти к следующему.

EDIT *

Вот пример использования Tweenlite для анимации переменной счета: Как изменить переменную с помощью Flash и 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();
        }
    }
}

А вот и главный класс:

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!');
        }
    }
}
...