108 lines
3.2 KiB
Lua
108 lines
3.2 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 )
|
|
|
|
---@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
|