summaryrefslogtreecommitdiff
path: root/camera.lua
diff options
context:
space:
mode:
Diffstat (limited to 'camera.lua')
-rw-r--r--camera.lua38
1 files changed, 38 insertions, 0 deletions
diff --git a/camera.lua b/camera.lua
new file mode 100644
index 0000000..09e528b
--- /dev/null
+++ b/camera.lua
@@ -0,0 +1,38 @@
+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 \ No newline at end of file