Files
retro3d/input.cm
2025-12-14 01:36:35 -06:00

123 lines
2.9 KiB
Plaintext

// Input module for lance3d
var events = use('sdl3/events')
var keyboard = use('sdl3/keyboard')
var mouse = use('sdl3/mouse')
// Private input state
var _keys_held = {}
var _keys_pressed = {}
var _mouse_x = 0
var _mouse_y = 0
var _mouse_buttons = {}
var _mouse_buttons_pressed = {}
var _axes = [0, 0, 0, 0]
// Key mapping for btn/btnp
var _key_map = ['z', 'x', 'c', 'v', 'a', 's', 'return', 'escape']
// Called at start of frame to reset pressed state
function begin_frame() {
_keys_pressed = {}
_mouse_buttons_pressed = {}
var ms = mouse.get_state()
if (ms) {
_mouse_x = ms.x
_mouse_y = ms.y
}
}
// Process SDL events, returns false if quit requested
function process_events() {
var ev
while ((ev = events.poll()) != null) {
if (ev.type == "quit" || ev.type == "window_close_requested") {
return false
}
if (ev.type == "key_down" || ev.type == "key_up") {
var key_name = keyboard.get_key_name(ev.key).toLowerCase()
var pressed = ev.type == "key_down"
if (pressed && !_keys_held[key_name]) {
_keys_pressed[key_name] = true
}
_keys_held[key_name] = pressed
// Map WASD to axes
if (key_name == "w") _axes[1] = pressed ? -1 : 0
if (key_name == "s") _axes[1] = pressed ? 1 : 0
if (key_name == "a") _axes[0] = pressed ? -1 : 0
if (key_name == "d") _axes[0] = pressed ? 1 : 0
}
if (ev.type == "mouse_button_down" || ev.type == "mouse_button_up") {
var btn_pressed = ev.type == "mouse_button_down"
if (btn_pressed && !_mouse_buttons[ev.button]) {
_mouse_buttons_pressed[ev.button] = true
}
_mouse_buttons[ev.button] = btn_pressed
}
}
return true
}
// Check if a key is held (by name)
function key(name) {
return _keys_held[name.toLowerCase()] || false
}
// Check if a key was just pressed this frame (by name)
function keyp(name) {
return _keys_pressed[name.toLowerCase()] || false
}
// Check if a button is held (by index 0-7)
function btn(id, player) {
var key_name = _key_map[id]
return _keys_held[key_name] || false
}
// Check if a button was just pressed (by index 0-7)
function btnp(id, player) {
var key_name = _key_map[id]
return _keys_pressed[key_name] || false
}
// Get axis value (-1, 0, or 1)
function axis(id) {
return _axes[id] || 0
}
// Get mouse position
function mouse_pos() {
return { x: _mouse_x, y: _mouse_y }
}
// Check if mouse button is held
function mouse_btn(button) {
return _mouse_buttons[button] || false
}
// Check if mouse button was just pressed
function mouse_btnp(button) {
return _mouse_buttons_pressed[button] || false
}
// Get raw access to keys_pressed for internal use
function get_keys_pressed() {
return _keys_pressed
}
return {
begin_frame: begin_frame,
process_events: process_events,
key: key,
keyp: keyp,
btn: btn,
btnp: btnp,
axis: axis,
mouse_pos: mouse_pos,
mouse_btn: mouse_btn,
mouse_btnp: mouse_btnp,
get_keys_pressed: get_keys_pressed,
}