This entry was posted on Thursday, October 16th, 2008 at 1:40 pm and is filed under ActionScript 3, flash, general, utils. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
hey guys, last week i needed to pause several timers and resume them later on. i ran into a problem which i try to explain in an little example.
so let’s say you start a Timer with 1000 milliseconds delay and stop it after 600 milliseconds. if you call Timer.start() again, it starts with a new delay of 1000 milliseconds again. there is no built-in possibility to resume the timer for the remaining 400 milliseconds. i thought “nothing easier than that, just call Timer.pause()”. but there was no such method, so i decided to write my own ExtendedTimer class and add the pause functionality. now i like to share it with you…
> ExtendedTimer.as
package com.fjakobs.utils
{
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* @author fjakobs
*/
public class ExtendedTimer extends Timer
{
private var _startTime : Number;
private var _initialDelay : Number;
private var _paused : Boolean = false;
public function ExtendedTimer(delay : Number,
repeatCount : int = 0)
{
super(delay, repeatCount);
_initialDelay = delay;
addEventListener(TimerEvent.TIMER,
onTimer,false,0,true);
}
private function onTimer(event : TimerEvent) : void
{
_startTime = new Date().time;
delay = _initialDelay;
}
override public function start() : void
{
if(currentCount < repeatCount)
{
_paused = false;
_startTime = new Date().time;
super.start();
}
}
public function pause() : void
{
if(running)
{
_paused = true;
stop();
delay = delay - (new Date().time - _startTime);
}
}
public function get paused() : Boolean
{
return _paused;
}
public function get initialDelay() : Number
{
return _initialDelay;
}
}
}
18 Responses to “pause Timer with ExtendedTimer in ActionScript 3.0”










October 16th, 2008 at 7:47 pm
[...] http://blog.fjakobs.com/archives/101. [...]
October 30th, 2008 at 4:06 pm
I’d rather make it:
delay = event.target.currentCount;
October 30th, 2008 at 5:03 pm
why exactly would you do this?
November 1st, 2008 at 9:07 am
Thanks for code. But there’s little bug – then repeatCount reaches it’s maximum, method start() will trigger anyway. I added:
override public function start() : void {
if(currentCount < _repeatCount){
_paused = false;
_startTime = new Date().time;
super.start();
}
}
where _repeatCount is repeatCount from consructor. Now it’s work fine.
November 3rd, 2008 at 10:19 am
hey – make it a static function, and you’re a genius!
November 4th, 2008 at 10:05 am
@Nikita, thank you for the tip, i updated the start method. now the timer won’t trigger if you call start() after the timer reaches it’s maximum repeatCount.
@grabek, do you think about a TimerManager?
November 12th, 2008 at 11:23 am
Another slight issue I faced is that in :
override public function start() : void
{
if(currentCount < _repeatCount)
{
_paused = false;
_startTime = new Date().time;
super.start();
}
}
… the “if” will never return true if _repeatCount is 0 since currentCount and and _repeatCount have the same value initally. Appending
|| _repeatCount == 0
to the if statement solved the problem for me.
November 12th, 2008 at 11:28 am
Oh, and needless to say: Lovely piece of code. Thanks a lot.
November 17th, 2008 at 7:37 am
TimerManager – I suppose so! (:
December 15th, 2008 at 5:52 pm
Hey, thanks for this class!!! But, I’m newbie in AS3, classes!
How I use this code in my class document after import it?
(sorry for my poor english… I’m brazilian)
December 15th, 2008 at 6:12 pm
Yep! It’s works fine here now! Thanks!!!
February 17th, 2009 at 4:22 am
very useful class. Thanks! I had to add this:
public function pause():void {
if (running) {
_paused = true;
stop();
var thisDelay:Number = delay – (new Date().time – _startTime);
if (thisDelay < 0) {
thisDelay = 0;
}
delay = thisDelay;
}
}
I kept getting errors when var delay was below 0.
February 24th, 2009 at 1:35 am
Very useful thanks so much!!
February 24th, 2009 at 1:42 am
@Peter – might be a little late but this is how you use it.
Once you import the class do the following.
1. Create a var with type Number and set it to how long you want the timer delay.
var newTimer:Number = 5000; //timer will run every 5sec
2. create a new instance of ExtendedTimer and pass in the timer var you just created above.
var timer1:ExtendedTimer = new ExtendedTimer(newTimer);
3. Now just use timer1.start(); and timer1.pause(); to pause the timer. To resume simply call timer1.start(); again.
That should do it! Good Luck
March 1st, 2009 at 2:57 pm
Thank you, saved me some time
March 17th, 2009 at 9:40 pm
This saved me a lot of hair pulling and time.
I needed the ability to reset this ExtendedTimer after it was paused but calling reset() didn’t reset the timer. I realized that was because you are adjusting the delay whenever start() was called.
I created a new function called resume() which acts like your start() function. I then modified your start() function to set delay = _initialDelay; This essentially resets the timer.
// timer continues from where it left off
public function resume() : void
{
if((currentCount < repeatCount) || (repeatCount == 0))
{
_paused = false;
_startTime = new Date().time;
super.start();
}
}
// timer gets reset
override public function start() : void
{
if((currentCount < repeatCount) || (repeatCount == 0))
{
delay = _initialDelay; // added to “reset” timer
_paused = false;
_startTime = new Date().time;
super.start();
}
}
So now I can either call start() which always resets the timer or I can call resume() which resumes the timer.
Thanks again for the code!
May 28th, 2009 at 4:29 am
I used this code to fix up my own pausable timer – very helpful, thanks
I also encountered the “delay 0) //if there’s no remainder, timer should start next cycle
{
delay = remainder; //otherwise, timer should finish current cycle
}
July 3rd, 2009 at 11:56 am
that is really usefull. thank you..