123 lines
2.9 KiB
Plaintext
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,
|
|
}
|