SCREEN = vec2(128, 128) _chunk_size = vec2(102, 102) _chunk_size:apply(function (v) assert(v % 2 == 0) end) _padding = (SCREEN - _chunk_size) / 2 assert(_chunk_size.x < SCREEN.x and _chunk_size.y < SCREEN.y) Camera = {} Camera.__index = Camera function Camera:update() line(_padding.x, SCREEN.y - _padding.y, _padding.x, _padding.y, 5) line(_chunk_size.x + _padding.x, SCREEN.y - _padding.y, _chunk_size.x + _padding.x, _padding.y, 5) line(_padding.x, _padding.y, SCREEN.x - _padding.x, _padding.y, 5) line(_padding.x, _chunk_size.y + _padding.y, SCREEN.x - _padding.x, _chunk_size.y + _padding.y, 5) assert(self.tracking.position) tracking_chunk = vec2(self.tracking.position / _chunk_size):apply(flr) if (tracking_chunk == self.current_chunk) then return end self.position = (tracking_chunk * _chunk_size) - _padding self.current_chunk = tracking_chunk end function Camera:render(entity) screen_position = (entity.sprite_position or entity.position) - self.position entity:render(screen_position) end function Camera:new(tracking) cam = setmetatable({ -- position = vec2(0, 0), -- current_chunk = vec2(0, 0), tracking = tracking }, Camera) AddUpdateHook(function (dt) cam:update() end) return cam end