input remapping + mouse control
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -3,12 +3,9 @@ local INPUT_KEY_UP = 0
|
||||
local INPUT_KEY_DOWN = 1
|
||||
local INPUT_KEY_LEFT = 2
|
||||
local INPUT_KEY_RIGHT = 3
|
||||
local INPUT_KEY_A = 4
|
||||
local INPUT_KEY_B = 5
|
||||
local INPUT_KEY_Y = 7
|
||||
local INPUT_KEY_SPACE = 48
|
||||
local INPUT_KEY_BACKSPACE = 51
|
||||
local INPUT_KEY_ENTER = 50
|
||||
|
||||
--- Checks if Up is pressed.
|
||||
--- @within Input
|
||||
@@ -22,22 +19,9 @@ function Input.left() return btnp(INPUT_KEY_LEFT) end
|
||||
--- Checks if Right is pressed.
|
||||
--- @within Input
|
||||
function Input.right() return btnp(INPUT_KEY_RIGHT) end
|
||||
--- Checks if Space is pressed.
|
||||
--- @within Input
|
||||
function Input.space() return keyp(INPUT_KEY_SPACE) end
|
||||
|
||||
--- Checks if Select is pressed.
|
||||
--- @within Input
|
||||
function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) end
|
||||
--- Checks if Menu Confirm is pressed.
|
||||
function Input.select() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_SPACE) or Mouse.clicked() end
|
||||
--- Checks if Back is pressed.
|
||||
--- @within Input
|
||||
function Input.menu_confirm() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_ENTER) end
|
||||
--- Checks if Player Interact is pressed.
|
||||
--- @within Input
|
||||
function Input.player_interact() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_ENTER) end
|
||||
--- Checks if Menu Back is pressed.
|
||||
--- @within Input
|
||||
function Input.menu_back() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_BACKSPACE) end
|
||||
--- Checks if Toggle Popup is pressed.
|
||||
--- @within Input
|
||||
function Input.toggle_popup() return keyp(INPUT_KEY_ENTER) end
|
||||
function Input.back() return keyp(INPUT_KEY_BACKSPACE) end
|
||||
|
||||
@@ -17,6 +17,7 @@ end
|
||||
--- @within Main
|
||||
function TIC()
|
||||
init_game()
|
||||
Mouse.update()
|
||||
|
||||
local now = time()
|
||||
if Context.last_frame_time == 0 then
|
||||
|
||||
43
inc/system/system.mouse.lua
Normal file
43
inc/system/system.mouse.lua
Normal file
@@ -0,0 +1,43 @@
|
||||
--- @section Mouse
|
||||
local _mx, _my = 0, 0
|
||||
local _mleft, _mleft_prev = false, false
|
||||
local _consumed = false
|
||||
|
||||
--- Updates mouse state. Call once per frame.
|
||||
--- @within Mouse
|
||||
function Mouse.update()
|
||||
_mleft_prev = _mleft
|
||||
_consumed = false
|
||||
local mt = {mouse()}
|
||||
_mx, _my, _mleft = mt[1], mt[2], mt[3]
|
||||
end
|
||||
|
||||
--- Returns current mouse X position.
|
||||
--- @within Mouse
|
||||
function Mouse.x() return _mx end
|
||||
|
||||
--- Returns current mouse Y position.
|
||||
--- @within Mouse
|
||||
function Mouse.y() return _my end
|
||||
|
||||
--- Returns true if the mouse button was just pressed this frame (and not yet consumed).
|
||||
--- @within Mouse
|
||||
function Mouse.clicked() return _mleft and not _mleft_prev and not _consumed end
|
||||
|
||||
--- Returns true if the mouse button is held down.
|
||||
--- @within Mouse
|
||||
function Mouse.held() return _mleft end
|
||||
|
||||
--- Marks the current click as consumed so Mouse.clicked() won't fire again this frame.
|
||||
--- @within Mouse
|
||||
function Mouse.consume() _consumed = true end
|
||||
|
||||
--- Returns true if the mouse is within the given rectangle.
|
||||
--- @within Mouse
|
||||
--- @param x number Left edge.
|
||||
--- @param y number Top edge.
|
||||
--- @param w number Width.
|
||||
--- @param h number Height.
|
||||
function Mouse.in_rect(x, y, w, h)
|
||||
return _mx >= x and _mx < x + w and _my >= y and _my < y + h
|
||||
end
|
||||
@@ -38,8 +38,12 @@ end
|
||||
--- @within UI
|
||||
--- @param items table A table of menu items.<br/>
|
||||
--- @param selected_item number The current index of the selected item.<br/>
|
||||
--- @param[opt] x number Menu x position (required for mouse support).<br/>
|
||||
--- @param[opt] y number Menu y position (required for mouse support).<br/>
|
||||
--- @param[opt] centered boolean Whether the menu is centered horizontally.<br/>
|
||||
--- @return number selected_item The updated index of the selected item.
|
||||
function UI.update_menu(items, selected_item)
|
||||
--- @return boolean mouse_confirmed True if the user clicked on a menu item.
|
||||
function UI.update_menu(items, selected_item, x, y, centered)
|
||||
if Input.up() then
|
||||
Audio.sfx_beep()
|
||||
selected_item = selected_item - 1
|
||||
@@ -53,7 +57,29 @@ function UI.update_menu(items, selected_item)
|
||||
selected_item = 1
|
||||
end
|
||||
end
|
||||
return selected_item
|
||||
|
||||
if x ~= nil and y ~= nil and Mouse.clicked() then
|
||||
local mx = Mouse.x()
|
||||
local my = Mouse.y()
|
||||
local menu_x = x
|
||||
if centered then
|
||||
local max_w = 0
|
||||
for _, item in ipairs(items) do
|
||||
local w = print(item.label, 0, -10, 0, false, 1, false)
|
||||
if w > max_w then max_w = w end
|
||||
end
|
||||
menu_x = (Config.screen.width - max_w) / 2
|
||||
end
|
||||
for i, _ in ipairs(items) do
|
||||
local item_y = y + (i - 1) * 10
|
||||
if my >= item_y and my < item_y + 10 and mx >= menu_x - 8 then
|
||||
Mouse.consume()
|
||||
return i, true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return selected_item, false
|
||||
end
|
||||
|
||||
--- Draws a bordered textbox with scrolling text.
|
||||
|
||||
Reference in New Issue
Block a user