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