From 319a64268802ef0ebc04c779271c077dccc124d6 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Fri, 4 Jul 2025 13:39:17 +0300 Subject: [PATCH] UI button and main menu beginning --- button.lua | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ grid.lua | 2 +- main.lua | 60 +++++++++++++++++++++++++-------------- mouse.lua | 5 ++++ 4 files changed, 128 insertions(+), 22 deletions(-) create mode 100644 button.lua diff --git a/button.lua b/button.lua new file mode 100644 index 0000000..eecb798 --- /dev/null +++ b/button.lua @@ -0,0 +1,83 @@ +require 'point' + +-- Clickable UI button +---@class Button +---@field position Point +---@field size Point +---@field prevPressed boolean +---@field lastPressed boolean +Button = { + position = Point:new( 1, 1 ), + size = Point:new( 1, 1 ), + prevPressed = false, + lastPressed = false +} + +-- Factory function +---@param position Point | nil +---@param size Point | nil +---@param pressed function | nil +---@param held function | nil +---@param released function | nil +---@return Button +function Button:new( position, size, pressed, held, released ) + local button = { + position = position or Button.position, + size = size or Button.size, + prevPressed = false, + lastPressed = false, + pressed = pressed or Button.pressed, + held = held or Button.held, + released = released or Button.released + } + + setmetatable( button, { __index = self } ) + + return button +end + +-- Called when button just clicked +function Button:pressed() end +-- Called when button is held +---@param dt number +function Button:held( dt ) dt = dt end +-- Called when button is just unclicked +function Button:released() end + +-- Drawing function +function Button:draw() + local x, y = self.position:coords() + local w, h = self.size:coords() + love.graphics.rectangle( 'line', x, y, w, h ) +end + +-- Check if given point is in bounds of button +---@param point Point +---@return boolean +function Button:checkPoint( point ) + local px, py = point:coords() + local sx, sy = self.position:coords() + local ex, ey = self.position:coords() + ex = ex + sx + ey = ey + sy + return px >= sx and px <= ex and py >= sy and py <= ey +end + +-- Changing states and calls appropriate functions +---@param dt number +---@param point Point +function Button:update( dt, point, pressed ) + self.prevPressed = self.lastPressed + self.lastPressed = pressed + + if self.lastPressed and not self.prevPressed then + local inBounds = self:checkPoint( point ) + if inBounds then + self:pressed() + end + elseif self.lastPressed and self.prevPressed then + self:held( dt ) + elseif not self.lastPressed and self.prevPressed then + self:released() + end +end diff --git a/grid.lua b/grid.lua index d6ca755..fd1e57c 100644 --- a/grid.lua +++ b/grid.lua @@ -12,7 +12,7 @@ Grid = { -- Factory function ---@param size Point ----@returns Grid +---@return Grid function Grid:new( size ) local grid = { lines = {}, diff --git a/main.lua b/main.lua index 7d4d338..3c03696 100644 --- a/main.lua +++ b/main.lua @@ -3,8 +3,11 @@ require 'point' require 'line' require 'mouse' require 'levelhandler' +require 'button' Input = require 'input' +InMenu = true + local function updateCellSize() local width, height = love.graphics.getDimensions() local gridX, gridY = GameGrid.size:coords(); @@ -14,8 +17,16 @@ local function updateCellSize() end function love.load() - GameGrid = LevelHandler:first() - updateCellSize() + love.window.setMode( 800, 480 ) + + local menuButtonReleased = function() + InMenu = false + GameGrid = LevelHandler:first() + updateCellSize() + end + + MenuStartButton = Button:new( Point:new( 240, 120 ), Point:new( 320, 80 ), nil, nil, menuButtonReleased ) + love.graphics.setLineStyle( Config.lineStyle ) end @@ -23,33 +34,40 @@ end function love.update( dt ) Mouse:update() Input:update() + if InMenu then + MenuStartButton:update( dt, Point:new( Mouse.x, Mouse.y ), Mouse.pressed ) + else + if Input:actionReleased( 'exit' ) then + love.event.quit() + end - if Input:actionReleased( 'exit' ) then - love.event.quit() - end - - if Input:actionReleased( 'nextlevel' ) then - if GameGrid:isCompleted() then - GameGrid = LevelHandler:next() - updateCellSize() + if Input:actionReleased( 'nextlevel' ) then + if GameGrid:isCompleted() then + GameGrid = LevelHandler:next() + updateCellSize() + end end end end function love.draw() - GameGrid:draw() + if InMenu then + MenuStartButton:draw() + else + GameGrid:draw() - local text = string.format( "%d:%d global\n%d:%d local\n%d:%d from start", Mouse.x, Mouse.y, Mouse.point.x, Mouse.point.y, Mouse.startX - Mouse.x, Mouse.startY - Mouse.y ) - love.graphics.print( text, 64, 256 ) + local text = string.format( "%d:%d global\n%d:%d local\n%d:%d from start", Mouse.x, Mouse.y, Mouse.point.x, Mouse.point.y, Mouse.startX - Mouse.x, Mouse.startY - Mouse.y ) + love.graphics.print( text, 64, 256 ) - if Mouse.dragged then - love.graphics.print( "drag", 64, 300 ) - end - if Mouse.lastLine ~= nil then - love.graphics.print( tostring( Mouse.lastLine ), 128, 300 ) - end + if Mouse.dragged then + love.graphics.print( "drag", 64, 300 ) + end + if Mouse.lastLine ~= nil then + love.graphics.print( tostring( Mouse.lastLine ), 128, 300 ) + end - if GameGrid:isCompleted() then - love.graphics.print( "Grid completed. Press space to proceed to next", 64, 320 ) + if GameGrid:isCompleted() then + love.graphics.print( "Grid completed. Press space to proceed to next", 64, 320 ) + end end end diff --git a/mouse.lua b/mouse.lua index af2ba94..b7ad814 100644 --- a/mouse.lua +++ b/mouse.lua @@ -31,6 +31,11 @@ function Mouse:update() Mouse.lastPoint = Mouse.point Mouse.lastPressed = Mouse.pressed Mouse.pressed = love.mouse.isDown( 1 ) + + if InMenu then + return + end + Mouse.point = GridPoint.snapCoords( Point:new( Mouse.x, Mouse.y ) ) if Mouse.lastLine ~= nil then local pointsLen = #Mouse.lastLine.points