require "grid" require "point" require "line" -- Returns local coords from global local function snapCoords( point ) local x = math.ceil( point.x / Config.cellSize ) local y = math.ceil( point.y / Config.cellSize ) return GridPoint:new( x, y ) end local function vectorLength( startpoint, endpoint ) return math.sqrt( ( startpoint.x - endpoint.x ) ^ 2 + ( startpoint.y - endpoint.y ) ^ 2 ) end 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 ) 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 = snapCoords( Point:new( Mouse.x, Mouse.y ) ) if Mouse.lastLine ~= nil then local pointsLen = #Mouse.lastLine.points local lastLinePoint = Mouse.lastLine.points[pointsLen] if vectorLength( Mouse.point, 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 vectorLength( 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