Input - BenBerke/Tilky-Engine GitHub Wiki

Input

Input reads the keyboard and mouse.

function Update()
    if Input.GetKeyDown(Key.E) then Debug.Print("E was pressed") end
end

Keys come from the Key table: Key.E, Key.Space, Key.LShift. Input is checked once per frame, so read it in Update, not in FixedUpdate (which may run zero or several times in a frame and miss or repeat a press).


Keyboard

Function Returns
GetKeyDown(key) boolean true only on the frame the key was pressed.
GetKey(key) boolean true every frame while the key is held.
GetKeyUp(key) boolean true only on the frame the key was released.
GetDoubleKey(key, keyTwo) boolean true while both keys are held.
GetDoubleKeyDown(key, keyTwo) boolean true on the frame both keys become held: either one was just pressed while the other is down. Good for shortcuts like Key.LCtrl, Key.S.
GetKeyName(key) string The key's name in the Key table: "E" for Key.E, "Space" for Key.Space. Good for on-screen prompts like [E] Open.
GetAnyKey() Key or nil A held key.
GetAnyKeyDown() Key or nil A key pressed this frame.
GetAnyKeyUp() Key or nil A key released this frame.

Keys

Every key is a value in the global Key table. The script editor and VS Code suggest them as you type Key..

Group Values
Letters Key.A to Key.Z
Number row Key.Alpha0 to Key.Alpha9 (the row above the letters, not the numpad)
Special Key.Space, Key.Escape, Key.Enter, Key.Tab, Key.Backspace
Arrows Key.Left, Key.Right, Key.Up, Key.Down
Modifiers Key.LShift, Key.RShift, Key.LCtrl, Key.RCtrl, Key.LAlt, Key.RAlt

The values are plain numbers, so you can keep one in a variable or compare two with ==.

A misspelled key (Key.Spcae) is nil, and passing nil or a number that isn't a key raises an error naming the problem.

Keys are physical positions on a US layout. On other layouts Key.Z is the key where Z is on a US keyboard, which keeps WASD-style controls in the same place.

The GetAnyKey functions

They return nil when no key qualifies. Keys without a value in the Key table, like F1, are ignored. If several keys qualify, they return the one that comes first: letters, then the number row, then the rest. They are best for "press any key to continue" and for simple key rebinding.

-- Wait for a key, then remember it as the "use" key.
local useKey = Key.E
local listening = false

function Update()
    if listening then
        local key = Input.GetAnyKeyDown()
        if key ~= nil then
            useKey = key
            listening = false
        end
    elseif Input.GetKeyDown(useKey) then
        Debug.Print("Use!")
    end
end

Mouse

Name Returns
GetMouseButtonDown(button) boolean true only on the frame the button was pressed.
GetMouseButton(button) boolean true while the button is held.
GetMouseButtonUp(button) boolean true only on the frame the button was released.
GetMousePosition() Vector2 The cursor position in window pixels, from the top-left corner.
MouseLeft, MouseMiddle, MouseRight integer Button numbers to pass to the functions above.
if Input.GetMouseButtonDown(Input.MouseLeft) then Fire() end
if Input.GetMouseButton(Input.MouseRight) then Aim() end

While the game runs, the mouse is captured for mouse look and the cursor is hidden, so GetMousePosition isn't very useful yet. Mouse look itself is handled by the Player Controller, not by scripts.


Examples

Toggle a flashlight

-- Scripts/Flashlight.lua (sector script): F switches the room light on and off.
local on = true
local litColor

function Start()
    litColor = sector.light
end

function Update()
    if not Input.GetKeyDown(Key.F) then return end

    on = not on
    sector:FadeLight(on and litColor or Vector3(20, 20, 20), 0.1)
end

Charge a throw while a key is held

-- Scripts/ChargeThrow.lua (on the player): hold G to charge, release to throw.
---@field maxCharge number @ Seconds To Full Power
maxCharge = 1.5

local charge = 0

function Update()
    if Input.GetKey(Key.G) then
        charge = mathT.Min(charge + GameTime.deltaTime, maxCharge)
    end

    if Input.GetKeyUp(Key.G) then
        local power = charge / maxCharge   -- 0..1
        Debug.Print("Throw with power", mathT.Round(power, 2))
        charge = 0
    end
end