82 lines
2.6 KiB
Lua
Raw Normal View History

local camera = {0, 0}
local screen = {800,600}
local squares = nil
local squaresize = 50
local maxx, maxy = 100, 100
--love.window.setMode( 1024, 768 )
function love.load()
-- build the map
squares = {}
for y = 1, maxy do
local row = {}
for x = 1, maxx do
local sq = {set = false}
table.insert(row, sq)
end
table.insert(squares, row)
end
screen[1] = love.graphics.getWidth()
screen[2] = love.graphics.getHeight()
end
function love.draw()
-- draw the currently visible portion of the map
-- this draws every partially visible square and relies
-- on love drawing code to clip the edges
local camx, camy = unpack(camera)
local scrx, scry = unpack(screen)
--Prevent camera from going off screen
local vleft = math.floor(camx/squaresize)
local vup = math.floor(camy/squaresize)
local horc = math.ceil(scrx/squaresize) + 1
local verc = math.ceil(scry/squaresize) + 1
-- Until the number of vertical squares
for y = 1, verc do
-- Until the number of horizontal squares
for x = 1, horc do
if squares[vup+y] and squares[vup+y][vleft+x] then
local mode = "line"
if squares[vup+y][vleft+x].set then
mode = "fill"
end
love.graphics.rectangle(mode, (vleft+x-1)*squaresize - camx,
(vup+y-1)*squaresize - camy, squaresize, squaresize)
end
end
end
end
local scrollspeed = 200
local edge = 100
function love.update(dt)
-- scroll the screen if mouse is near edges
local scrx, scry = unpack(screen)
local mx, my = love.mouse.getPosition()
if mx < edge/2 then camera[1] = camera[1] - scrollspeed * dt end
if mx > scrx - edge/2 then camera[1] = camera[1] + scrollspeed * dt end
if my < edge/2 then camera[2] = camera[2] - scrollspeed * dt end
if my > scry - edge/2 then camera[2] = camera[2] + scrollspeed * dt end
-- limit the camera position from wandering off
if camera[1] < -edge then camera[1] = -edge end
if camera[2] < -edge then camera[2] = -edge end
local xlimit, ylimit = maxx*squaresize + edge - scrx, maxy*squaresize + edge - scry
if camera[1] > xlimit then camera[1] = xlimit end
if camera[2] > ylimit then camera[2] = ylimit end
end
function love.mousepressed(x, y, button)
-- toggle the clicked square on left button click
if button ~= 'l' then return end
local wx, wy = x + camera[1], y + camera[2]
local x, y = math.floor(wx/squaresize)+1, math.floor(wy/squaresize)+1
if squares[y] and squares[y][x] then
local value = squares[y][x].set
squares[y][x].set = not value -- toggle bool flag
end
end