Compare commits

..

2 commits

Author SHA1 Message Date
20d7c75b07
improve battery ui 2026-04-14 15:59:43 +02:00
5d6625fdd6
fix movement 2026-04-14 15:50:48 +02:00
3 changed files with 36 additions and 28 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

View file

@ -29,7 +29,7 @@
;; global vars
(var player-art nil) ; 25x50 pixels each player is 25x25
(var dust-sprite nil) ; 35x35 pixels
(var ui-bg nil)
(var battery-bar-sprite nil)
(var walls-sprite nil)
(var walls-batch nil)
(var wall-quads nil)
@ -65,7 +65,7 @@
;; load world images
(set walls-sprite (love.graphics.newImage "assets/walls.png"))
(set walls-batch (love.graphics.newSpriteBatch walls-sprite 2500))
(set ui-bg (love.graphics.newImage "assets/ui.png"))
(set battery-bar-sprite (love.graphics.newImage "assets/battery_bar.png"))
;; load wall quads
(set wall-quads [])
@ -132,34 +132,42 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start))
(each [_ collider (pairs collider-debug-boxes)]
(love.graphics.rectangle "line" collider.x collider.y collider.width collider.height))))
(local has-true? (fn [lst]
(accumulate [found? false _ v (ipairs lst)]
(or found? v))))
; All true
(local all-true? (fn [lst]
(accumulate [result true _ v (ipairs lst)]
(and result v))))
(fn love.update [dt]
; move / rotate player
(let [
d (love.keyboard.isDown :d)
a (love.keyboard.isDown :a)
e (love.keyboard.isDown :e)
q (love.keyboard.isDown :q)]
(case [d a e q]
[true false false false] (tset player :rot (+ player.rot (* dt 2)))
[false true false false] (tset player :rot (- player.rot (* dt 2)))
[false false true false] (tset player :rot (- player.rot (* dt 2)))
[false false false true] (tset player :rot (+ player.rot (* dt 2)))
d-key (love.keyboard.isDown :d)
a-key (love.keyboard.isDown :a)
e-key (love.keyboard.isDown :e)
q-key (love.keyboard.isDown :q)]
; (print (fennel.view {: d-key : a-key : e-key : q-key}))
(match {:d-key d-key :a-key a-key :e-key e-key :q-key q-key}
{:d-key true :a-key false :e-key false :q-key false} (tset player :rot (+ player.rot (* dt 2)))
{:d-key false :a-key true :e-key false :q-key false} (tset player :rot (- player.rot (* dt 2)))
{:d-key false :a-key false :e-key true :q-key false} (tset player :rot (- player.rot (* dt 2)))
{:d-key false :a-key false :e-key false :q-key true} (tset player :rot (+ player.rot (* dt 2)))
)
(if (or d a e q)
(when (and (> player.battery 0) (or d-key a-key e-key q-key))
(let [
dir-fn (if (or d a) #(+ $1 $2) #(- $1 $2))
dir-fn (if (or d-key a-key) #(+ $1 $2) #(- $1 $2))
new-x (dir-fn player.x (* player.speed dt (math.cos player.rot)))
new-y (dir-fn player.y (* player.speed dt (math.sin player.rot)))
(x y) (bump-world:move player new-x new-y)]
(tset player :x x)
(tset player :y y))))
(tset player :y y))
(if (> player.battery 0)
(tset player :battery (- player.battery (* dt 2))))))
;; Update camera to follow player (keep player centered on screen)
(tset camera :x (- player.x (/ screen.canvas-w 2)))
(tset camera :y (- player.y (/ screen.canvas-h 2)))
)
(tset camera :y (- player.y (/ screen.canvas-h 2))))
(fn draw-ui []
(love.graphics.push)
@ -168,12 +176,12 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start))
(set-color :cream)
(love.graphics.rectangle "fill" 0 0 screen.canvas-w 100)
(reset-color)
(love.graphics.draw ui-bg 0 0)
(love.graphics.draw battery-bar-sprite 78 8)
(set-color :dark-purple)
(love.graphics.setFont font)
(love.graphics.print "Battery:" 20 6)
(love.graphics.print (.. "Battery: " (string.format "%d" player.battery) "%") 6 7)
(set-color :light-blue)
(love.graphics.rectangle "fill" 72 12 (* 152 (/ player.battery 100)) 4)
(love.graphics.rectangle "fill" 80 12 (* 152 (/ player.battery 100)) 4)
(love.graphics.setFont font-small)
(set-color :dark-purple)
(love.graphics.print "100%" 229 2)