diff --git a/main.lua b/main.lua index 8820ecc..2232ea2 100644 --- a/main.lua +++ b/main.lua @@ -1,6 +1,7 @@ require 'grid' require 'point' require 'line' +require 'mouse' function love.load() love.graphics.setLineStyle( Config.lineStyle ) @@ -26,71 +27,12 @@ function love.load() ) GameGrid:push( line2 ) - ---@class Mouse - ---@field lastLine Line? - ---@field lastPoint Point? - Mouse = { - x = 0, - y = 0, - pressed = false, - lastPressed = false, - startX = -1, - startY = -1, - dragged = false, - lastLine = nil, - lastPoint = nil, - point = Point:new( 0, 0 ) - } -end + end -- TODO: move input interactions into module -- TODO: fix collision with other line's endpoint function love.update( dt ) - Mouse.x, Mouse.y = love.mouse.getPosition() - Mouse.x = Mouse.x + 1 - Mouse.y = Mouse.y + 1 - Mouse.lastPoint = Mouse.point - Mouse.lastPressed = Mouse.pressed - Mouse.pressed = love.mouse.isDown( 1 ) - Mouse.point = GridPoint.snapCoords( Point:new( Mouse.x, Mouse.y ) ) - if Mouse.lastLine ~= nil then - local pointsLen = #Mouse.lastLine.points - local lastLinePoint = Mouse.lastLine.points[pointsLen] - if Mouse.point:distanceTo( lastLinePoint ) == 1 - and GameGrid:inBounds( Mouse.point ) - and GameGrid:matchesLine( Mouse.point, true ) == nil - and not lastLinePoint:equals( Mouse.lastLine.endpoint ) - and not GameGrid:isOtherEndpoint( Mouse.lastLine, Mouse.point ) then - Mouse.lastLine:push( Mouse.point ) - elseif Mouse.lastLine:has( Mouse.point ) - and not Mouse.point:equals( lastLinePoint ) then - while not Mouse.lastLine.points[#Mouse.lastLine.points]:equals( Mouse.point ) do - Mouse.lastLine:pop() - end - end - end - - - Mouse.dragged = Mouse.pressed - and Mouse.startX > 0 - and Point.distanceTo ( - Point:new( Mouse.x, Mouse.y ), - Point:new( Mouse.startX, Mouse.startY ) - ) > Config.dragSensivity - - if not Mouse.pressed and Mouse.startX > 0 then - Mouse.startX = -1 - Mouse.startY = -1 - Mouse.lastLine = nil - end - - if not Mouse.lastPressed - and Mouse.pressed - and Mouse.startX < 0 then - Mouse.startX = Mouse.x - Mouse.startY = Mouse.y - Mouse.lastLine = GameGrid:matchesLine( Mouse.point, false ) - end + Mouse:update() end function love.draw() diff --git a/mouse.lua b/mouse.lua new file mode 100644 index 0000000..af2ba94 --- /dev/null +++ b/mouse.lua @@ -0,0 +1,74 @@ +-- TODO: rewrite +---@class Mouse +---@field x integer +---@field y integer +---@field pressed boolean +---@field lastPressed boolean +---@field startX integer +---@field startY integer +---@field dragged boolean +---@field lastLine Line? +---@field lastPoint GridPoint? +---@field point GridPoint +Mouse = { + x = 0, + y = 0, + pressed = false, + lastPressed = false, + startX = -1, + startY = -1, + dragged = false, + lastLine = nil, + lastPoint = nil, + point = GridPoint:new( 0, 0 ) +} + +-- TODO: fix collision with other line's endpoint +function Mouse:update() + Mouse.x, Mouse.y = love.mouse.getPosition() + Mouse.x = Mouse.x + 1 + Mouse.y = Mouse.y + 1 + Mouse.lastPoint = Mouse.point + Mouse.lastPressed = Mouse.pressed + Mouse.pressed = love.mouse.isDown( 1 ) + Mouse.point = GridPoint.snapCoords( Point:new( Mouse.x, Mouse.y ) ) + if Mouse.lastLine ~= nil then + local pointsLen = #Mouse.lastLine.points + local lastLinePoint = Mouse.lastLine.points[pointsLen] + if Mouse.point:distanceTo( lastLinePoint ) == 1 + and GameGrid:inBounds( Mouse.point ) + and GameGrid:matchesLine( Mouse.point, true ) == nil + and not lastLinePoint:equals( Mouse.lastLine.endpoint ) + and not GameGrid:isOtherEndpoint( Mouse.lastLine, Mouse.point ) then + Mouse.lastLine:push( Mouse.point ) + elseif Mouse.lastLine:has( Mouse.point ) + and not Mouse.point:equals( lastLinePoint ) then + while not Mouse.lastLine.points[#Mouse.lastLine.points]:equals( Mouse.point ) do + Mouse.lastLine:pop() + end + end + end + + + Mouse.dragged = Mouse.pressed + and Mouse.startX > 0 + and Point.distanceTo ( + Point:new( Mouse.x, Mouse.y ), + Point:new( Mouse.startX, Mouse.startY ) + ) > Config.dragSensivity + + if not Mouse.pressed and Mouse.startX > 0 then + Mouse.startX = -1 + Mouse.startY = -1 + Mouse.lastLine = nil + end + + if not Mouse.lastPressed + and Mouse.pressed + and Mouse.startX < 0 then + Mouse.startX = Mouse.x + Mouse.startY = Mouse.y + Mouse.lastLine = GameGrid:matchesLine( Mouse.point, false ) + end + +end