implemented mouse controls for titlescreen mode_select
added supporting functions to util and dimensions
This commit is contained in:
parent
5d3e4457eb
commit
f227df0dee
|
@ -21,4 +21,25 @@ dimtable.updateResolution = function(ratio)
|
|||
end
|
||||
end
|
||||
|
||||
---Convert screenspace coordinates to viewspace coordinates
|
||||
---@param screenX number
|
||||
---@param screenY number
|
||||
---@param offsetX? number Viewport offset from the left side (defaults to the portrait viewport offset)
|
||||
---@param offsetY? number Viewport offset from the top side (defaults to 0)
|
||||
---@return number, number
|
||||
dimtable.toViewSpace = function (screenX, screenY, offsetX, offsetY)
|
||||
offsetX = offsetX or (dimtable.screen.width - dimtable.view.width) / 2
|
||||
offsetY = offsetY or 0
|
||||
|
||||
local viewX, viewY, scaleX, scaleY
|
||||
|
||||
scaleX = dimtable.design.width / dimtable.view.width
|
||||
scaleY = dimtable.design.height / dimtable.view.height
|
||||
|
||||
viewX = (screenX - offsetX) * scaleX
|
||||
viewY = (screenY - offsetY) * scaleY
|
||||
|
||||
return viewX, viewY
|
||||
end
|
||||
|
||||
return dimtable
|
||||
|
|
|
@ -54,11 +54,16 @@ local function roundToZero(x)
|
|||
end
|
||||
end
|
||||
|
||||
local function areaOverlap(x, y, areaX, areaY, areaW, areaH)
|
||||
return x > areaX and y > areaY and x < areaX + areaW and y < areaY + areaH
|
||||
end
|
||||
|
||||
return {
|
||||
splitString = splitString,
|
||||
filter = filter,
|
||||
clamp = clamp,
|
||||
round = round,
|
||||
sign = sign,
|
||||
roundToZero = roundToZero
|
||||
roundToZero = roundToZero,
|
||||
areaOverlap = areaOverlap
|
||||
}
|
|
@ -85,10 +85,10 @@ function render(deltaTime)
|
|||
end
|
||||
|
||||
function mouse_pressed(button)
|
||||
if true then return 0 end
|
||||
if (currentScreen.screen.onMousePressed) then
|
||||
currentScreen.screen.onMousePressed(button)
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
function button_pressed(button)
|
||||
|
|
|
@ -4,6 +4,7 @@ local Wallpaper = require("components.wallpaper")
|
|||
local Background = require("components.background")
|
||||
local Dim = require("common.dimensions")
|
||||
local lang = require("language.call")
|
||||
local util = require("common.util")
|
||||
|
||||
local cursorIndex = 3
|
||||
local buttonHeight = 128 + 16
|
||||
|
@ -89,6 +90,51 @@ local buttons = {
|
|||
},
|
||||
}
|
||||
|
||||
local miscButtons = {
|
||||
upArrow = {
|
||||
x = Dim.design.width - 265,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER - buttonHeight + 4,
|
||||
w = 64,
|
||||
h = 36
|
||||
},
|
||||
downArrow = {
|
||||
x = Dim.design.width - 265,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER + buttonHeight / 2 + 28,
|
||||
w = 64,
|
||||
h = 36
|
||||
},
|
||||
mainButton = {
|
||||
x = Dim.design.width - 512,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER - buttonHeight / 2 - 28,
|
||||
w = 505,
|
||||
h = 196
|
||||
},
|
||||
upButton1 = {
|
||||
x = Dim.design.width - 512,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER - 128 - buttonHeight,
|
||||
w = 1026 / 2,
|
||||
h = 257 / 2
|
||||
},
|
||||
upButton2 = {
|
||||
x = Dim.design.width - 512,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER - 128 - buttonHeight * 2,
|
||||
w = 1026 / 2,
|
||||
h = 257 / 2
|
||||
},
|
||||
downButton1 = {
|
||||
x = Dim.design.width - 512,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER + 128 + 10,
|
||||
w = 1026 / 2,
|
||||
h = 257 / 2
|
||||
},
|
||||
downButton2 = {
|
||||
x = Dim.design.width - 512,
|
||||
y = Dim.design.height / 2 + SELECTOR_BAR_OFFSET_FROM_CENTER + 128 + buttonHeight + 10,
|
||||
w = 1026 / 2,
|
||||
h = 257 / 2
|
||||
},
|
||||
}
|
||||
|
||||
local scrollTransitionScale = 1 -- Goes from 0 to 1 when transition is happening, sits at 1 when it's not.
|
||||
local buttonsMovementScale = 0 -- Basically same as `scrollTransitionScale` but with a +/- sign for the scroll direction and goes from 1 to 0
|
||||
|
||||
|
@ -100,6 +146,15 @@ local playedBgm = false
|
|||
|
||||
local triggerServiceMenu = false
|
||||
|
||||
local function setButtonActions()
|
||||
buttons[1].action = Menu.Challenges
|
||||
buttons[2].action = Menu.Multiplayer
|
||||
buttons[3].action = Menu.Start
|
||||
buttons[4].action = Menu.DLScreen
|
||||
buttons[5].action = Menu.Settings
|
||||
buttons[6].action = Menu.Exit
|
||||
end
|
||||
|
||||
local function draw_button(button, x, y, selected, index)
|
||||
if (selected) then
|
||||
-- Draw button background
|
||||
|
@ -234,15 +289,6 @@ local function drawTexts()
|
|||
gfx.FillColor(255, 255, 255)
|
||||
end
|
||||
|
||||
local function setButtonActions()
|
||||
buttons[1].action = Menu.Challenges
|
||||
buttons[2].action = Menu.Multiplayer
|
||||
buttons[3].action = Menu.Start
|
||||
buttons[4].action = Menu.DLScreen
|
||||
buttons[5].action = Menu.Settings
|
||||
buttons[6].action = Menu.Exit
|
||||
end
|
||||
|
||||
local function drawHeader()
|
||||
gfx.BeginPath()
|
||||
gfx.FillColor(0, 0, 0, BAR_ALPHA)
|
||||
|
@ -253,26 +299,6 @@ local function drawHeader()
|
|||
gfx.ImageRect(Dim.design.width / 2 - 200, HEADER_HEIGHT / 2 - 20, 400, 40, resources.images.headerTitleImage, 1, 0)
|
||||
end
|
||||
|
||||
local function onKnobsChange(direction)
|
||||
-- game.Log(direction, game.LOGGER_ERROR)
|
||||
cursorIndex = cursorIndex + direction
|
||||
if (cursorIndex == 0) then
|
||||
cursorIndex = #buttons
|
||||
elseif (cursorIndex == #buttons + 1) then
|
||||
cursorIndex = 1
|
||||
end
|
||||
|
||||
scrollTransitionScale = 0 -- Reset transitions and play them
|
||||
|
||||
scrollingUp = false
|
||||
if ((cursorIndex > oldCursorIndex and not (cursorIndex == 6 and oldCursorIndex == 1)) or
|
||||
(cursorIndex == 1 and oldCursorIndex == 6)) then scrollingUp = true end
|
||||
|
||||
game.PlaySample("titlescreen/cursor_change.wav")
|
||||
|
||||
oldCursorIndex = cursorIndex
|
||||
end
|
||||
|
||||
local function draw_titlescreen(deltaTime)
|
||||
gfx.LoadSkinFont("segoeui.ttf")
|
||||
|
||||
|
@ -310,24 +336,9 @@ local function draw_titlescreen(deltaTime)
|
|||
-- Draw top and bottom bars
|
||||
drawHeader()
|
||||
Footer.draw(deltaTime)
|
||||
|
||||
gfx.ResetTransform()
|
||||
end
|
||||
|
||||
local function render(deltaTime)
|
||||
if not playedBgm then
|
||||
game.PlaySample("titlescreen/bgm.wav", true)
|
||||
playedBgm = true
|
||||
end
|
||||
|
||||
Dim.updateResolution()
|
||||
|
||||
Wallpaper.render()
|
||||
|
||||
Dim.transformToScreenSpace()
|
||||
|
||||
draw_titlescreen(deltaTime)
|
||||
|
||||
local function tickTransitions(deltaTime)
|
||||
scrollTransitionScale = scrollTransitionScale + deltaTime / 0.2
|
||||
if (scrollTransitionScale > 1) then scrollTransitionScale = 1 end
|
||||
|
||||
|
@ -336,13 +347,49 @@ local function render(deltaTime)
|
|||
else
|
||||
buttonsMovementScale = -1 + scrollTransitionScale
|
||||
end
|
||||
end
|
||||
|
||||
local function render(deltaTime)
|
||||
if not playedBgm then
|
||||
game.PlaySample("titlescreen/bgm.wav", true)
|
||||
playedBgm = true
|
||||
end
|
||||
|
||||
game.SetSkinSetting("_currentScreen", "title")
|
||||
|
||||
Dim.updateResolution()
|
||||
|
||||
Wallpaper.render()
|
||||
|
||||
Dim.transformToScreenSpace()
|
||||
|
||||
tickTransitions(deltaTime)
|
||||
|
||||
draw_titlescreen(deltaTime)
|
||||
|
||||
if (triggerServiceMenu) then
|
||||
triggerServiceMenu = false
|
||||
return {eventType = "switch", toScreen = "service"}
|
||||
end
|
||||
end
|
||||
|
||||
gfx.BeginPath()
|
||||
local function callButtonAction()
|
||||
if buttons[cursorIndex].action == nil then setButtonActions() end
|
||||
buttons[cursorIndex].action()
|
||||
end
|
||||
|
||||
local function onKnobsChange(direction)
|
||||
cursorIndex = (cursorIndex - 1 + direction) % #buttons + 1
|
||||
|
||||
scrollTransitionScale = 0 -- Reset transitions and play them
|
||||
|
||||
scrollingUp = false
|
||||
if ((cursorIndex > oldCursorIndex and not (cursorIndex == 6 and oldCursorIndex == 1)) or
|
||||
(cursorIndex == 1 and oldCursorIndex == 6)) then scrollingUp = true end
|
||||
|
||||
game.PlaySample("titlescreen/cursor_change.wav")
|
||||
|
||||
oldCursorIndex = cursorIndex
|
||||
end
|
||||
|
||||
local function onButtonPressed(button)
|
||||
|
@ -350,8 +397,7 @@ local function onButtonPressed(button)
|
|||
game.PlaySample("titlescreen/cursor_select.wav")
|
||||
game.StopSample("titlescreen/bgm.wav")
|
||||
|
||||
if buttons[cursorIndex].action == nil then setButtonActions() end
|
||||
buttons[cursorIndex].action()
|
||||
callButtonAction()
|
||||
|
||||
elseif button == game.BUTTON_BCK then
|
||||
Menu.Exit()
|
||||
|
@ -362,12 +408,58 @@ local function onButtonPressed(button)
|
|||
end
|
||||
end
|
||||
|
||||
-- the thing is... titlescreen script does not have a call to reset function... WHYYYYY
|
||||
function reset() playedBgm = false end
|
||||
local function onMousePressed(button)
|
||||
local mousePosX, mousePosY = Dim.toViewSpace(game.GetMousePos())
|
||||
local changeIndex = 0
|
||||
|
||||
if button ~= 0 then
|
||||
return
|
||||
end
|
||||
|
||||
if util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.mainButton.x, miscButtons.mainButton.y, miscButtons.mainButton.w, miscButtons.mainButton.h) then
|
||||
game.StopSample("titlescreen/bgm.wav")
|
||||
game.PlaySample("titlescreen/cursor_select.wav")
|
||||
callButtonAction()
|
||||
return
|
||||
|
||||
elseif util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.upArrow.x, miscButtons.upArrow.y, miscButtons.upArrow.w, miscButtons.upArrow.h) or
|
||||
util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.upButton1.x, miscButtons.upButton1.y, miscButtons.upButton1.w, miscButtons.upButton1.h) then
|
||||
changeIndex = -1
|
||||
scrollTransitionScale = 0
|
||||
scrollingUp = false
|
||||
|
||||
elseif util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.downArrow.x, miscButtons.downArrow.y, miscButtons.downArrow.w, miscButtons.downArrow.h) or
|
||||
util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.downButton1.x, miscButtons.downButton1.y, miscButtons.downButton1.w, miscButtons.downButton1.h) then
|
||||
changeIndex = 1
|
||||
scrollTransitionScale = 0
|
||||
scrollingUp = true
|
||||
|
||||
elseif util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.upButton2.x, miscButtons.upButton2.y, miscButtons.upButton2.w, miscButtons.upButton2.h) then
|
||||
changeIndex = -2
|
||||
scrollTransitionScale = 0
|
||||
scrollingUp = false
|
||||
|
||||
elseif util.areaOverlap(mousePosX, mousePosY,
|
||||
miscButtons.downButton2.x, miscButtons.downButton2.y, miscButtons.downButton2.w, miscButtons.downButton2.h) then
|
||||
changeIndex = 2
|
||||
scrollTransitionScale = 0
|
||||
scrollingUp = true
|
||||
end
|
||||
|
||||
cursorIndex = (cursorIndex - 1 + changeIndex) % #buttons + 1
|
||||
game.PlaySample("titlescreen/cursor_change.wav")
|
||||
|
||||
end
|
||||
|
||||
return {
|
||||
render = render,
|
||||
onKnobsChange = onKnobsChange,
|
||||
onButtonPressed = onButtonPressed,
|
||||
onMousePressed = function() return false end,
|
||||
onMousePressed = onMousePressed,
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue