-
Notifications
You must be signed in to change notification settings - Fork 18
Timer API v7
- status: complete
- version: 6.x
The Timer API is a subset of the Client API and it is used to create new game timers, measure the time passed between two events, randomly fire events, etc.
The object node.timer
contains all the methods of the
Timer API and instantiates new GameTimer
objects.
A GameTimer is a configurable object to measure time lapses, time differences, and to fire events at a specific moment in time.
GameTimers pause automatically whenever the game is paused and resume automatically when the game is resumed.
To create a new GameTimer use the method createTimer
or its alias create
.
Create a timer that will fire the default "TIMEUP" event after 10 seconds.
var timer = node.timer.create(10000);
// Timers do not start automatically.
timer.start();
// Anywhere in the game code you can listen to the "TIMEUP" event.
node.on("TIMEUP", function() {
alert("Time is up!");
});
To change the default event, pass a configuration object with the timeup
and milliseconds
properties.
node.timer.create({
// Timer expires after 10 seconds.
milliseconds: 10000,
// Event to fire or function to execute at timeup.
timeup: 'TIMER_DONE'
})
.start();
To create a recurrent timer that fires periodically, specify the update
and hooks
parameters.
var timer = node.timer.create({
// Timer expires after 10 seconds.
milliseconds: 10000,
// Every second the hooks are executed/fired.
update: 1000,
// An array of events or functions to fire at every update.
hooks: [
// Update functions receive the number of milliseconds left and a
// reference to the game timer itself as input parameters.
function(timeLeft, timer) {
console.log((timeLeft/1000) + " seconds to go.");
},
// It is possible to specify the context of execution of a hook.
{
hook: function(timeLeft, timer) {
console.log("Hello " + this.name + "! You have " +
(timeLeft/1000) + " seconds left.")
},
ctx: {
name: 'Mickey'
}
},
// This event is fired every second.
'ONE_SECOND_PASSED'
]
});
// Timers do not start automatically.
timer.start();
// Anywhere in the game code you can listen to the "ONE_SECOND_PASSED" event.
node.on("ONE_SECOND_PASSED", function(timeLeft, timer) {
console.log((timeLeft/1000) + " seconds to go.");
});
You can force an early timeup with the method doTimeUp
.
var timer = node.timer.create(10000);
// Timers do not start automatically.
timer.start();
// Expire the timer early.
timer.doTimeUp();
After a timer has been created the following methods are available to control its behavior:
- stop: stops and clear timer (resuming not possible, restart required),
- pause: pauses timer (resuming possible),
- resume: resumes a paused timer,
- init: inits a stopped timer (without starting it),
- restart: restarts a stopped timer (inits and starts it).
The setTimeout is a shortcut to create and start a game timer with the same syntax of the JavaScript setTimeout method.
node.timer.setTimeout(function() {
console.log("Time expired!")
}, 10000);
Using the method from the Timer API instead of the native JS setTimeout has two advantages:
- the timeout is automatically paused and resumed when the game is paused and resumed,
- the timeout is tied to the step in which it is created and automatically disposed if the step is terminated earlier (see next section Timer validity).
Timers are valid only within the step in which they are created. This means that, regardless of whether the timer expired or not, the timer will be disposed when entering the next step.
To change the default behavior and extend the life of a timer across steps use the validity
flag.
node.timer.create({
milliseconds: 10000,
// Keeps the timer alive through all the steps of the current stage.
validity: 'stage'
})
.start();
// With the setTimeout syntax.
node.timer.setTimeout(function() {
console.log("Time expired!")
}, 10000, 'stage');
Accepted values for validity are:
- ng: as long as nodeGame is running (across games)
- game: the entire game (across stages)
- stage: the entire stage (across steps)
- step: current step (default).
To retrieve a timer for which you no longer have a direct reference you need to name it and then use the method node.timer.getTimer
.
var timer = node.timer.create({
name: 'myName',
milliseconds: 10000
})
timer.name; // myName
// Retrieving the timer by name.
var timer2 = node.timer.getTimer('myName');
timer2.name; // myName
Alternatively, timers can be retrieved from the node.game.timer.timers
collection.
The following methods are available to destroy timers (cannot be undone):
- node.timer.destroyTimer(timer): a given timer,
- node.timer.destroyStepTimers(): all timers with validity current step,
- node.timer.destroyStageTimers(): all timers with validity current stage,
- node.timer.destroyAllTimers(): all timers (use with caution!).
It is possible to timestamp specific events using the command
setTimestamp
and choosing a name for it.
node.timer.setTimestamp('mytimestamp');
The command optionally takes a second parameter to set the timestamp
to a specific time, rather than (new Date()).getTime()
.
To retrieve a timestamp later, use the command getTimestamp
with the
name of chosen timestamp, or getAllTimestamps
to get them all in an
object.
node.timer.getTimestamp('mytimestamp');
To measure time differences the following methods are available:
// Time passed since a timestamp was defined.
node.timer.getTimeSince('mytimestamp');
// Time interval between two timestamps.
node.timer.getTimeDiff('mytimestamp', 'mysecondtimestamp');
The following timestamps are automatically created:
- start: time since the game has been started
- paused: time since the game has been paused for the last time
- resumed: time since the game has been resumed for the last time
- stage time since the game entered in the current stage
- step: time since the the game entered in the current step
The timestamps above are overwritten every time the same event happens while the game is executed. For instance, the 'step' timestamp is overwritten at every new step.
However, the timestamp related to each specific 'step' are kept under the name or the id of the step. That is, the timestamp related to the beginning of step 1.1.1 is stored under '1.1.1'.
To fire an event or execute a callback at random within a certain time
interval you can use the node.timer.random(minWait, maxWait)
method and chain the appropriate handler:
- emit: emits an event,
- exec: executes a callback,
- done: calls node.done,
- timeup: calls node.timer.doTimeup.
For instance:
// Emits the event 'MY_EVENT' randomly in the next 20 seconds.
node.timer.random(20000).emit('MY_EVENT');
// Emits the event 'MY_EVENT' randomly between the next 10 and 20 seconds.
node.timer.random(10000, 20000).emit('MY_EVENT');
The default value of minWait is 1000 and maxWait is 5000, so the following code will randomly emit an event between 1 and 5 seconds.
node.timer.random().emit('MY_EVENT');
// Or even shorter.
node.timer.random.emit('MY_EVENT');
The wait
method is equivalent to having a random timer with where minWait and maxWait are the same.
// Equivalent to node.timer.random(20000, 20000).emit('MY_EVENT');
node.timer.wait(20000).emit('MY_EVENT');
It's possible to add a probability that an event will fire, a function will be executed, etc. with the prob
method.
// With probability 0.5, the event is fired randomly in the next 20 seconds.
node.timer.random(20000).prob(0.5).emit('MY_EVENT');
If the probability to fire is not known in advance, a function can be specified as a parameter to prob
.
node.timer.random(20000).prob(function() {
// Condition probability on current score in the game (0-1).
// Higher scores have lower probability to fire here.
return Math.random() > node.game.score;
}).emit('MY_EVENT');
-
createTimer
|create
destroyTimer
destroyStepTimers
destroyStageTimers
destroyAllTimers
setTimestamp
getTimestamp
getAllTimestamps
getTimeSince
getTimeDiff
getTimer
init
fire
start
addHook
removeHook
pause
resume
stop
restart
isRunning
isStopped
isPaused
Go back to the wiki Home.
Copyright (C) 2021 Stefano Balietti
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.