get basic player movement working with collisions

Press any key to quit" 10 10))
This commit is contained in:
Travis Shears 2026-04-11 14:16:05 +02:00
parent 506cd5a28e
commit e3a7182de1
Signed by: travisshears
GPG key ID: CB9BF1910F3F7469

View file

@ -8,30 +8,15 @@
(var walls-sprite nil) (var walls-sprite nil)
(var walls-batch nil) (var walls-batch nil)
(var wall-quads nil) (var wall-quads nil)
(local debug true)
(local collider-debug-boxes []) (local collider-debug-boxes [])
(local bump-world (bump.newWorld 25)) (local bump-world (bump.newWorld 25))
(local game-state { (local player { :x 50 :y 50 :w 25 :h 25 :speed 80 })
:player-pos [0 0]
:player-dir :n ; n = north, s = south, e = east, w = west
:level 1
:world []
})
; (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 [] (fn love.load []
(love.window.setMode 600 640) (love.window.setMode 600 640)
(bump-world:add player player.x player.y player.w player.h)
;; load world images ;; load world images
(set walls-sprite (love.graphics.newImage "assets/walls.png")) (set walls-sprite (love.graphics.newImage "assets/walls.png"))
@ -53,7 +38,7 @@
(walls-batch:add (. wall-quads id) x y) (walls-batch:add (. wall-quads id) x y)
; (print (fennel.view colliders)) ; (print (fennel.view colliders))
(each [_ collider (pairs 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 (table.insert
collider-debug-boxes collider-debug-boxes
{:x (+ x collider.x) :y (+ y collider.y) :width collider.width :height collider.height}) {: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)] (let [(ok val) (pcall fennel.eval line)]
(print (if ok (fennel.view val) val)))) (print (if ok (fennel.view val) val))))
;; drawing ;; drawing
(lambda color [full-r full-g full-b] (lambda color [full-r full-g full-b]
(let [(r g b) (love.math.colorFromBytes 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) (love.graphics.draw walls-batch)
) )
; (print (fennel.view game-state)) (fn love.update [dt]
; (fn draw-player [] (let [deltas { :dx 0 :dy 0}]
; (love.graphics.setColor 1 1 1) ; reset color to white (no tinting) (if (love.keyboard.isDown :right)
; (let [ [player-x player-y] (. game-state :player-pos) ] (tset deltas :dx (* player.speed dt))
; (love.graphics.draw (if (love.keyboard.isDown :left)
; (. player-art :player-sprite) (tset deltas :dx (* (* -1 player.speed) dt))))
; (. player-art :player1-quad) (if (love.keyboard.isDown :down)
; (+ (* 25 player-x) x-offset 25) (tset deltas :dy (* player.speed dt))
; (+ (* 25 player-y) y-offset 25)))) (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 [] (fn love.draw []
;; clear the screen and set bg to off white ;; clear the screen and set bg to off white
(love.graphics.clear) (love.graphics.clear)
(draw-world) (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))
;; draw collider debug boxes
(when debug
(love.graphics.setColor (unpack black)) ; reset color to white (no tinting) (love.graphics.setColor (unpack black)) ; reset color to white (no tinting)
(each [_ collider (pairs collider-debug-boxes)] (each [_ collider (pairs collider-debug-boxes)]
(love.graphics.rectangle "line" collider.x collider.y collider.width collider.height)) (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)) ; (love.graphics.print "Hello from Fennel!\nPress any key to quit" 10 10))
(fn love.keypressed [key] (fn love.keypressed [key] nil )
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)))
)