From e3a7182de154c29739588f27f96c7a1a25572a55 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Sat, 11 Apr 2026 14:16:05 +0200 Subject: [PATCH] get basic player movement working with collisions Press any key to quit" 10 10)) --- two_player_cleaning_game/main.fnl | 89 ++++++++++++------------------- 1 file changed, 34 insertions(+), 55 deletions(-) diff --git a/two_player_cleaning_game/main.fnl b/two_player_cleaning_game/main.fnl index 1248baf..6d666bc 100644 --- a/two_player_cleaning_game/main.fnl +++ b/two_player_cleaning_game/main.fnl @@ -8,30 +8,15 @@ (var walls-sprite nil) (var walls-batch nil) (var wall-quads nil) +(local debug true) (local collider-debug-boxes []) (local bump-world (bump.newWorld 25)) -(local game-state { - :player-pos [0 0] - :player-dir :n ; n = north, s = south, e = east, w = west - :level 1 - :world [] -}) +(local player { :x 50 :y 50 :w 25 :h 25 :speed 80 }) -; (lambda gen-wall-colliders [x y tile-id] -; (let [colliders ( -; (icollect [_ v (ipairs (. levels :level01 :wall-colliders)] - -; )] -; (if (< 2 v) (* v v))) - - -; )]) - - -; ) (fn love.load [] (love.window.setMode 600 640) + (bump-world:add player player.x player.y player.w player.h) ;; load world images (set walls-sprite (love.graphics.newImage "assets/walls.png")) @@ -53,7 +38,7 @@ (walls-batch:add (. wall-quads id) x y) ; (print (fennel.view colliders)) (each [_ collider (pairs colliders)] - (bump-world:add {: x : y} (+ x collider.x) (+ y collider.y) collider.width collider.height) + (bump-world:add {: x : y :type "wall"} (+ x collider.x) (+ y collider.y) collider.width collider.height) (table.insert collider-debug-boxes {:x (+ x collider.x) :y (+ y collider.y) :width collider.width :height collider.height}) @@ -76,8 +61,6 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start)) (let [(ok val) (pcall fennel.eval line)] (print (if ok (fennel.view val) val)))) - - ;; drawing (lambda color [full-r full-g full-b] (let [(r g b) (love.math.colorFromBytes full-r full-g full-b)] @@ -93,48 +76,44 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start)) (love.graphics.draw walls-batch) ) -; (print (fennel.view game-state)) -; (fn draw-player [] -; (love.graphics.setColor 1 1 1) ; reset color to white (no tinting) -; (let [ [player-x player-y] (. game-state :player-pos) ] -; (love.graphics.draw -; (. player-art :player-sprite) -; (. player-art :player1-quad) -; (+ (* 25 player-x) x-offset 25) -; (+ (* 25 player-y) y-offset 25)))) +(fn love.update [dt] + (let [deltas { :dx 0 :dy 0}] + (if (love.keyboard.isDown :right) + (tset deltas :dx (* player.speed dt)) + (if (love.keyboard.isDown :left) + (tset deltas :dx (* (* -1 player.speed) dt)))) + (if (love.keyboard.isDown :down) + (tset deltas :dy (* player.speed dt)) + (if (love.keyboard.isDown :up) + (tset deltas :dy (* (* -1 player.speed) dt)))) + (if (or (not= 0 deltas.dx) (not= 0 deltas.dy)) + (let [(x y) (bump-world:move player (+ player.x deltas.dx) (+ player.y deltas.dy))] + ; (print (fennel.view { :msg "Moving player" :x x :y y})) + (tset player :x x) + (tset player :y y))))) (fn love.draw [] ;; clear the screen and set bg to off white (love.graphics.clear) (draw-world) + ;; draw player + (love.graphics.draw + (. player-art :player-sprite) + (. player-art :player1-quad) + player.x player.y) + ;; draw player hitbox + (when debug + (love.graphics.setColor (unpack black)) ; reset color to white (no tinting) + (love.graphics.rectangle "line" player.x player.y player.w player.h)) - (love.graphics.setColor (unpack black)) ; reset color to white (no tinting) - (each [_ collider (pairs collider-debug-boxes)] - (love.graphics.rectangle "line" collider.x collider.y collider.width collider.height)) + ;; draw collider debug boxes + (when debug + (love.graphics.setColor (unpack black)) ; reset color to white (no tinting) + (each [_ collider (pairs collider-debug-boxes)] + (love.graphics.rectangle "line" collider.x collider.y collider.width collider.height))) ) ; (love.graphics.print "Hello from Fennel!\nPress any key to quit" 10 10)) -(fn love.keypressed [key] - nil - ; (let [ - ; [player-x player-y] (. game-state :player-pos) - ; [next-player-x next-player-y] (case key - ; :left [(- player-x 1) player-y] - ; :up [player-x (- player-y 1)] - ; :right [(+ player-x 1) player-y] - ; :down [player-x (+ player-y 1)] - ; _ [player-x player-y]) - ; next-cell (. game-state :world next-player-y next-player-x) - ; valid-move (not= :wall (. next-cell :type)) - ; ] - ; (when valid-move - ; (tset game-state :player-pos [next-player-x next-player-y])) - ; (tset game-state :world next-player-y next-player-x :revealed true) - ; (case key - ; :left (tset game-state :player-dir :w) - ; :up (tset game-state :player-dir :n) - ; :right (tset game-state :player-dir :e) - ; :down (tset game-state :player-dir :s))) - ) +(fn love.keypressed [key] nil )