Search code examples
actionscript-3flashtimercountdown

Action Script 3.0. Remake timer to countdown timer


I have timer which counting time in following format mm:ss starts from 00:00. I need to make countdown timer which starts from 30 seconds

My timer looks like:

public class Test extends Sprite {

        var timer:Timer; 
        var txtTime:TextField;
        var tmpTime:Number;  //this will store the time when the game is started 
}

function game(e:MouseEvent) {
            timer = new Timer(0); //create a new timer that ticks every second.
            timer.addEventListener(TimerEvent.TIMER, tick, false, 0, true);              //listen for the timer tick
            timer.addEventListener(TimerEvent.TIMER, resetTimer);
            txtTime = new TextField();
            txtTime.text = setNull(0);

            var format:TextFormat = new TextFormat();
            format.color = 0x000000;
            format.size = 22;
            format.bold = true;
            txtTime.defaultTextFormat = format;
            txtTime.x = 603;
            txtTime.y = 143;
            addChild(txtTime);

            timer.reset();

            tmpTime = flash.utils.getTimer();
            timer.start();
}

        function setNull(startTime:int):String
        {
            return "00:00";
        }
        private function tick(e:Event):void {
            txtTime.text = showTimePassed(tmpTime);
        }
        function showTimePassed(startTime:int):String {
            var leadingZeroS:String = ""; //how many leading 0's to put in front of the seconds
            var leadingZeroM:String = "";
            var time = getTimer() - startTime; //this gets the amount of miliseconds elapsed
            var seconds = Math.floor((time / 1000) % 60); //this gets the amount of seconds

            if (seconds < 10) { //if seconds are less than two digits, add the leading zero
                leadingZeroS = "0";
            }       
            if (seconds < 600) { //if seconds are less than two digits, add the leading zero
                leadingZeroM = "0";
            }       
            var minutes = Math.floor( (time / (60 * 1000) ) ); //60 seconds times 1000 miliseocnds gets the minutes
            return leadingZeroM + minutes + ":" + leadingZeroS + seconds;
        }
        public function resetTimer(event:TimerEvent):void
        {
            var timer:Timer = event.target as Timer;
            timer.reset();
            timer.start();
        }
        function getTimePassed(startTime:int):Number
        {
            return (getTimer() - startTime) /1000;
        }

I can't get success to changing It to countdown from 30 seconds.

I've tried to declare timer in following: timer = new Timer(1000, 30); and change var time = 30 - getTimer(); instead of var time = getTimer() - startTime; but It not working.

Have you ideas? Thank you!


Solution

  • To create a countdown, you can use the Timer.currentCount like this :

    var time:int = 0;
    var timer:Timer = new Timer(1000, 30)
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        function onTimer(e:TimerEvent):void {
            time = timer.repeatCount - timer.currentCount;
            trace('00:' + (time < 10 ? '0' + time : time)); // gives : 00:29, 00:28, .., 00:01, 00:00
        }
        timer.start();
    
    trace('00:' + (timer.repeatCount - time));              //  gives : 00:30
    

    Hope that can help.