require 'grid' require 'point' require 'line' function love.load() love.graphics.setLineStyle( Config.lineStyle ) love.graphics.setLineWidth( Config.lineWidth ) GameGrid = Grid:new( Point:new( 5, 5 ) ) local line = Line:new( GridPoint:new( 1, 1 ), GridPoint:new( 3, 3 ), Color.red ) GameGrid:push( line ) local line1 = Line:new( GridPoint:new( 1, 5 ), GridPoint:new( 5, 2 ), Color.green ) GameGrid:push( line1 ) local line2 = Line:new( GridPoint:new( 2, 5 ), GridPoint:new( 5, 3 ), Color.blue ) 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 -- 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 end function love.draw() 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 ) 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 end