diff options
Diffstat (limited to 'main.lua')
| -rw-r--r-- | main.lua | 65 |
1 files changed, 54 insertions, 11 deletions
@@ -4,11 +4,11 @@ local obj = require "obj" obj.load_types() line = love.graphics.line set_color = love.graphics.setColor -love.graphics.setLineWidth(0.5) +line_width = 0.4 local cam = { x = 0, y = 0, - scale = 256, + scale = 1.1, panning = false, } @@ -19,25 +19,64 @@ for i = 1, 100 do }) end -local function view_scale() +obj.new("test", {0, 0}) + +local function window_scale() local w, h = love.graphics.getDimensions() - return cam.scale / math.min(w, h) + return 256 / math.min(w, h) end -local function view_transform() +local function view_scale() + return window_scale() / cam.scale +end + +local function view_dimensions() + local w, h = love.graphics.getDimensions() local scale = view_scale() + return w * scale, h * scale +end + +local function window_transform() + local scale = window_scale() local trans = love.math.newTransform(0, 0, 0, 1/scale, 1/scale) - trans:translate(cam.x, cam.y) + return trans +end + +local function view_transform() + local w, h = view_dimensions() + local trans = window_transform() + trans:scale(cam.scale, cam.scale) + trans:translate(-cam.x + w/2, -cam.y + h/2) return trans end function love.draw() - love.graphics.clear(0,0,0) + love.graphics.clear(0, 0, 0) + local w, h = view_dimensions() + local cx1, cy1 = cam.x - w/2, cam.y - h/2 + local cx2, cy2 = cam.x + w/2, cam.y + h/2 + love.graphics.applyTransform(view_transform()) - for _, o in pairs(world.objects) do - love.graphics.setColor(1, 1, 1) + -- the line thickness will scale according to the zoom amount. counteract this. + love.graphics.setLineWidth(line_width / cam.scale) + -- draw a grid + set_color(0.1, 0.1, 0.1) + for x = cx1 - cx1%64, cx2, 64 do + for y = cy1 - cy1%64, cy2, 64 do + line(x, y, x + world.chunk_size, y) + line(x, y, x, y + world.chunk_size) + end + end + -- draw all possibly visible objects + for o in world.iterate(cx1 - 20, cy1 - 20, cx2 + 20, cy2 + 20) do + set_color(1, 1, 1) o:draw() end + love.graphics.origin() + + love.graphics.applyTransform(window_transform()) + love.graphics.setLineWidth(line_width) + set_color(1, 1, 1) end function love.update() @@ -62,7 +101,11 @@ function love.mousemoved(_, _, dx, dy) if cam.panning then local scale = view_scale() dx, dy = dx * scale, dy * scale - cam.x = cam.x + dx - cam.y = cam.y + dy + cam.x = cam.x - dx + cam.y = cam.y - dy end end + +function love.wheelmoved(_, y) + cam.scale = math.min(math.max(cam.scale + (y * 0.1), 0.25), 4) +end |
