(local assets (require "src/assets.fnl")) (local levels (require "levels.fnl")) (local color (require "src/colors.fnl")) (local walls { :quads [] :batch nil :collider-debug-boxes [] :debug-grid-canvas nil }) (lambda mirror-collider [collider] "Mirror a collider box horizontally within a 25-unit tile (center is at 12.5) Transforms collider positions so they're reflected across the vertical center line." { :x (- 25 collider.x collider.width) :y collider.y :width collider.width :height collider.height }) (fn draw-debug-grid [] (let [f (love.graphics.newFont 6)] (love.graphics.setFont f) (for [x 0 100 1] (for [y 0 100 1] (let [x1 (* x 100) y1 (* y 100)] (love.graphics.line x1 y1 (+ x1 1000) y1) (love.graphics.line x1 y1 x1 (+ y1 1000)) (love.graphics.print (.. (string.format "%d" x1) "," (string.format "%d" y1)) (+ x1 3) (+ y1 3))))))) (fn walls.load [self] (set self.batch (love.graphics.newSpriteBatch assets.walls-sprite 2500)) ;; load quads (let [(w h) (assets.walls-sprite:getDimensions)] (for [i 0 19 1] (table.insert self.quads (love.graphics.newQuad (* i 25) 0 25 25 w h)))) ;; fill batch (each [_ row (pairs (. levels :levels self.pool.data.level-key :tiles))] (each [_ tile (pairs row)] (let [ x tile.x y tile.y id tile.tile-id colliders tile.colliders] (if (and (> id 0) (< id 21)) ;; 1-20 are wall tiles (do (self.batch:add (. self.quads id) (if tile.h-flip (+ x 25) x) y 0 (if tile.h-flip -1 1) 1) (each [_ collider (pairs colliders)] (let [ mirrored-collider (if tile.h-flip (mirror-collider collider) collider) collider-x (+ x mirrored-collider.x) collider-y (+ y mirrored-collider.y)] (self.pool.data.bump-world:add {: x : y :name :wall :behavior :block} collider-x collider-y mirrored-collider.width mirrored-collider.height) (table.insert self.collider-debug-boxes {:x collider-x :y collider-y :width mirrored-collider.width :height mirrored-collider.height})))))))) (set self.debug-grid-canvas (love.graphics.newCanvas 1000 1000)) (love.graphics.setCanvas self.debug-grid-canvas) (draw-debug-grid) (love.graphics.setCanvas) ) (fn walls.draw49 [self] (color.reset-color) (love.graphics.draw self.batch)) (fn walls.draw-debug [self] "draw collider debug boxes" (color.set-color :black) ; (draw-debug-grid) (love.graphics.draw self.debug-grid-canvas 0 0) (each [_ collider (pairs self.collider-debug-boxes)] (love.graphics.rectangle "line" collider.x collider.y collider.width collider.height))) walls