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 ) 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 = 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 -- Returns local coords from global 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 function vectorLength( startpoint, endpoint ) return math.sqrt( ( startpoint.x - endpoint.x ) ^ 2 + ( startpoint.y - endpoint.y ) ^ 2 ) end