package main import "core:math" import "core:math/linalg" import "core:slice" Timer :: struct { duration: f32, time: f32, active: bool, finished: proc(data: rawptr), data: rawptr } TIMER_SIZE :: 128 timers : [dynamic]^Timer timers_clean :: proc() { for timer, i in timers { free(timer) } } timer_start :: proc( time: f32, data: rawptr = nil, callback: proc(data: rawptr) = nil ) -> ^Timer { timer := new(Timer) timer.duration = time timer.active = true timer.data = data timer.finished = callback append(&timers, timer) return timer } timer_cancel :: proc(t: ^Timer) { t.active = false } timers_process :: proc(delta: f32) { #reverse for timer, i in timers { if !timer.active { free(timer) unordered_remove(&timers, i) continue } timer.time += delta if timer.time >= timer.duration { timer.active = false if timer.finished != nil { timer.finished(timer.data) } } } }