package demonchime import sapp "shared:sokol/app" KeybindInput :: union { sapp.Keycode, sapp.Mousebutton, } Keybind :: struct { input: KeybindInput, pressed: bool, just_pressed: bool, } Input :: struct { move_left: Keybind, move_right: Keybind, jump: Keybind, key_down: [sapp.MAX_KEYCODES]bool, key_just_down: [sapp.MAX_KEYCODES]bool, mouse_down: [sapp.MAX_MOUSEBUTTONS]bool, mouse_just_down: [sapp.MAX_MOUSEBUTTONS]bool, } init_keybinds :: proc(input: ^Input) { input.move_left.input = sapp.Keycode.A input.move_right.input = sapp.Keycode.D input.jump.input = sapp.Keycode.SPACE } input_event :: proc(event: ^sapp.Event, input: ^Input) { #partial switch event.type { case .KEY_DOWN: input.key_down[event.key_code] = true input.key_just_down[event.key_code] = true case .KEY_UP: input.key_down[event.key_code] = false case .MOUSE_DOWN: input.mouse_down[event.key_code] = true input.mouse_just_down[event.key_code] = true case .MOUSE_UP: input.mouse_down[event.key_code] = false } } is_keybind_down :: proc(input: Input, keybind: Keybind) -> bool { switch val in keybind.input { case sapp.Keycode: return input.key_down[val] case sapp.Mousebutton: return input.mouse_down[val] } assert(false) return false }