lines-lua/main.lua
2025-05-20 17:03:47 +03:00

111 lines
3.1 KiB
Lua

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 ) then
mouse.lastLine:push( mouse.point )
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