diff --git a/two_player_cleaning_game/src/levels/tutorial.fnl b/two_player_cleaning_game/src/levels/tutorial.fnl index 9882aca..53aea32 100644 --- a/two_player_cleaning_game/src/levels/tutorial.fnl +++ b/two_player_cleaning_game/src/levels/tutorial.fnl @@ -1,57 +1,28 @@ (local color (require "src/colors.fnl")) (local nata (require "libs/nata")) (local utils (require "src/utils.fnl")) +(local camera (require "src/systems/camera.fnl")) (local beholder (require "libs/beholder")) (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] (let [ canvas (love.graphics.newCanvas screen.canvas-w screen.canvas-h) pool (nata.new { + :data { + : screen + : canvas + } ; :groups { ; gravity = {filter = {'gravity'}}, ; :post-draw {:filter [:post-draw]} ; } - ; :systems [ - ; (gen-camera screen) - ; ] + :systems [ + (nata:oop) + camera + ] })] - (pool:queue (gen-renderer screen canvas)) (pool:queue player) - (pool:queue (gen-camera screen)) pool)) { diff --git a/two_player_cleaning_game/src/systems/camera.fnl b/two_player_cleaning_game/src/systems/camera.fnl new file mode 100644 index 0000000..aba8e51 --- /dev/null +++ b/two_player_cleaning_game/src/systems/camera.fnl @@ -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