3.2 KiB
Input System
Source: src/dusk/input/
The input system decouples physical hardware buttons from logical game actions via a binding layer. Actions are defined in src/dusk/input/input.csv and code-generated into inputaction_t enum values — see architecture.md.
Concepts
Button (inputbutton_t) — a physical input source: a keyboard scancode, gamepad button, gamepad axis, or pointer axis. The available button types depend on which DUSK_INPUT_* defines are active for the target platform.
Action (inputaction_t) — a logical game input (e.g. INPUT_ACTION_UP, INPUT_ACTION_CONFIRM, INPUT_ACTION_RAGEQUIT). Each action accumulates a float value [0.0, 1.0] from all buttons bound to it.
Binding — a many-to-one mapping from buttons to actions. Bindings are registered at runtime with inputBind(button, action).
Querying actions
// Boolean helpers (current frame):
inputIsDown(action) // value > 0 this frame
inputPressed(action) // down this frame but not last
inputReleased(action) // down last frame but not this
// Last frame state:
inputWasDown(action)
// Raw float value:
inputGetCurrentValue(action) // [0.0, 1.0]
inputGetLastValue(action)
// Axis helpers — combine two opposing actions into a signed float:
float_t h = inputAxis(INPUT_ACTION_LEFT, INPUT_ACTION_RIGHT); // -1.0 to 1.0
inputAxis2D(negX, posX, negY, posY, result); // fills vec2
inputAngle2D(negX, posX, negY, posY, result); // atan2-based normalized direction
// Deadzone:
float_t clean = inputDeadzone(rawValue, 0.1f);
Dynamic values (DUSK_TIME_DYNAMIC)
On platforms with variable frame rates, each action also tracks dynamicDelta-scaled values:
inputGetCurrentValueDynamic(action)
inputGetLastValueDynamic(action)
These account for the actual time elapsed since the last frame, so movement calculated from them is frame-rate independent.
Events on actions
Each inputactiondata_t exposes onPressed and onReleased events:
eventSubscribe(&INPUT.actions[INPUT_ACTION_CONFIRM].onPressed, myCallback, myUser);
The callback signature is void cb(void *params, void *user). params is always NULL for input events.
Buttons and bindings
Physical buttons are typed via inputbuttontype_t:
| Constant | When available | Payload |
|---|---|---|
INPUT_BUTTON_TYPE_KEYBOARD |
DUSK_INPUT_KEYBOARD |
inputscancode_t |
INPUT_BUTTON_TYPE_GAMEPAD |
DUSK_INPUT_GAMEPAD |
inputgamepadbutton_t |
INPUT_BUTTON_TYPE_GAMEPAD_AXIS |
DUSK_INPUT_GAMEPAD |
axis + positive direction flag |
INPUT_BUTTON_TYPE_POINTER |
DUSK_INPUT_POINTER |
inputpointeraxis_t |
Button names and default bindings are defined in input.csv. Look up a button by name:
inputbutton_t btn = inputButtonGetByName("keyboard_w");
inputBind(btn, INPUT_ACTION_UP);
INPUT_BUTTON_DATA[] holds runtime state (current/last raw values) for every physical button.
Platform platform-specific reads
inputButtonGetValuePlatform(button) is the one required platform function — it returns the current raw [0.0, 1.0] value for a button. The platform implementations live in src/dusk{platform}/input/.