Initial timer implementation.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
package game
|
||||
|
||||
// Purpose of Timer: a small reusable piece of state that tracks:
|
||||
// "how much time has passed of a set duration,"
|
||||
// (spawning, cooldowns, etc.) can ask "has my interval finished yet"
|
||||
// without each system hand-rolling its own countdown variable.
|
||||
Timer :: struct {
|
||||
active: bool,
|
||||
fired: bool,
|
||||
loop: bool,
|
||||
elapsed: f32,
|
||||
duration: f32
|
||||
}
|
||||
|
||||
init_timer :: proc(duration: f32, looping:bool) -> Timer {
|
||||
timer := Timer{
|
||||
active = true,
|
||||
loop = looping,
|
||||
duration = duration,
|
||||
}
|
||||
|
||||
return timer
|
||||
}
|
||||
|
||||
reset_timer :: proc(timer: ^Timer) {
|
||||
timer.active = true
|
||||
timer.fired = false
|
||||
timer.elapsed = 0
|
||||
}
|
||||
|
||||
// returns true when the timer has just fired this frame
|
||||
update_timer :: proc(timer: ^Timer, dt: f32) -> bool {
|
||||
|
||||
if timer.active {
|
||||
// increment the timer
|
||||
timer.elapsed += dt
|
||||
|
||||
if timer.elapsed >= timer.duration {
|
||||
timer.fired = true
|
||||
|
||||
// reset timer now
|
||||
// @NOTE:
|
||||
// dont set to 0 use the timers duration
|
||||
// accounts leftover overshoot time isn't lost
|
||||
// keeps long-term timing accurate rather than drifting
|
||||
timer.elapsed -= timer.duration
|
||||
|
||||
// Deactivate 1 shot timers
|
||||
if timer.loop == false {
|
||||
timer.active = false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user