move camera into a system module

This commit is contained in:
Travis Shears 2026-04-24 09:17:58 +02:00
parent f69f08f656
commit 77dccc9e6f
Signed by: travisshears
GPG key ID: CB9BF1910F3F7469
2 changed files with 45 additions and 38 deletions

View file

@ -1,57 +1,28 @@
(local color (require "src/colors.fnl")) (local color (require "src/colors.fnl"))
(local nata (require "libs/nata")) (local nata (require "libs/nata"))
(local utils (require "src/utils.fnl")) (local utils (require "src/utils.fnl"))
(local camera (require "src/systems/camera.fnl"))
(local beholder (require "libs/beholder")) (local beholder (require "libs/beholder"))
(local player (require "src/entities/player.fnl")) (local player (require "src/entities/player.fnl"))
(lambda gen-renderer [screen canvas]
(let [renderer {}]
(fn renderer.draw99 [self]
; (print "draw99 drawing canvas to screen")
(love.graphics.pop) ; undo camera translation
(love.graphics.setCanvas) ; reset to root canvas
(color:reset-color)
(love.graphics.draw canvas 0 0 0 screen.scale screen.scale))
(fn renderer.draw1 [self]
; use canvas
(love.graphics.setCanvas canvas)
; clear the screen
(love.graphics.clear)
(color.set-color :cream)
(love.graphics.rectangle "fill" 0 0 screen.canvas-w screen.canvas-h))
renderer))
(lambda gen-camera [screen]
(let [camera {:x 0 :y 0}]
(fn camera.draw2 [self]
(love.graphics.push)
(love.graphics.translate (* -1 self.x) (* -1 self.y)))
(fn camera.load [self]
(beholder.observe "PLAYER.POS" (lambda [x y]
;; Update camera to follow player (keep player centered on screen)
(set self.x (- x (/ screen.canvas-w 2)))
(set self.y (- y (/ screen.canvas-h 2))))))
camera
))
; (local debug true)
(fn load [screen] (fn load [screen]
(let [ (let [
canvas (love.graphics.newCanvas screen.canvas-w screen.canvas-h) canvas (love.graphics.newCanvas screen.canvas-w screen.canvas-h)
pool (nata.new { pool (nata.new {
:data {
: screen
: canvas
}
; :groups { ; :groups {
; gravity = {filter = {'gravity'}}, ; gravity = {filter = {'gravity'}},
; :post-draw {:filter [:post-draw]} ; :post-draw {:filter [:post-draw]}
; } ; }
; :systems [ :systems [
; (gen-camera screen) (nata:oop)
; ] camera
]
})] })]
(pool:queue (gen-renderer screen canvas))
(pool:queue player) (pool:queue player)
(pool:queue (gen-camera screen))
pool)) pool))
{ {

View file

@ -0,0 +1,36 @@
(local beholder (require "libs/beholder"))
(local color (require "src/colors.fnl"))
;; Camera System
(local camera {:x 0 :y 0})
(fn camera.draw2 [self]
(love.graphics.push)
(love.graphics.translate (* -1 self.x) (* -1 self.y)))
(fn camera.load [self]
(let [screen self.pool.data.screen]
(beholder.observe "PLAYER.POS" (lambda [x y]
;; Update camera to follow player (keep player centered on screen)
(set self.x (- x (/ screen.canvas-w 2)))
(set self.y (- y (/ screen.canvas-h 2)))))))
(fn camera.draw99 [self]
(let [screen self.pool.data.screen canvas self.pool.data.canvas]
(love.graphics.pop) ; undo camera translation
(love.graphics.setCanvas) ; reset to root canvas
(color:reset-color)
(love.graphics.draw canvas 0 0 0 screen.scale screen.scale)))
(fn camera.draw1 [self]
(let [screen self.pool.data.screen canvas self.pool.data.canvas]
; use canvas
(love.graphics.setCanvas canvas)
; clear the screen
(love.graphics.clear)
(color.set-color :cream)
(love.graphics.rectangle "fill" 0 0 screen.canvas-w screen.canvas-h)))
camera