aboutsummaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-08 01:32:55 +0100
committerGene Pasquet <dev@etenil.net>2026-04-08 01:32:55 +0100
commit84840ede6646ed793b61cdd889d3f57ab05e9311 (patch)
tree2b62dd73a7321bc71a368b297ab40b3535bd79fc /demo
parent7903180321bf72b344077a8423930ac161872a2c (diff)
Refactor to be functional
Diffstat (limited to 'demo')
-rw-r--r--demo/platformer.scm10
-rw-r--r--demo/sandbox.scm23
-rw-r--r--demo/scaling.scm3
-rw-r--r--demo/shmup.scm54
-rw-r--r--demo/topdown.scm10
-rw-r--r--demo/tweens.scm5
6 files changed, 58 insertions, 47 deletions
diff --git a/demo/platformer.scm b/demo/platformer.scm
index ff5caf7..3bad9bd 100644
--- a/demo/platformer.scm
+++ b/demo/platformer.scm
@@ -55,15 +55,17 @@
(load-sounds! '((jump . "demo/assets/jump.wav"))))
create: (lambda (game)
- (let ((scene (game-load-scene! game "demo/assets/level-0.tmx")))
- (scene-add-entity scene (make-player))
- (scene-camera-target-set! scene 'player)))
+ (game-scene-set! game
+ (chain (game-load-scene! game "demo/assets/level-0.tmx")
+ (scene-add-entity _ (make-player))
+ (update-scene _ camera-target: 'player))))
update: (lambda (game dt)
(let* ((input (game-input game))
(scene (game-scene game))
(tm (scene-tilemap scene))
(player (update-player (car (scene-entities scene)) input tm)))
- (scene-entities-set! scene (list player))))))
+ (game-scene-set! game
+ (update-scene scene entities: (list player)))))))
(game-run! *game*)
diff --git a/demo/sandbox.scm b/demo/sandbox.scm
index 319ef80..6a6030f 100644
--- a/demo/sandbox.scm
+++ b/demo/sandbox.scm
@@ -159,16 +159,17 @@
update: (lambda (game dt)
(set! *demo-t* (+ *demo-t* dt))
- (let* ((scene (game-scene game))
- (tm (scene-tilemap scene)))
- (scene-update-entities scene (cut step-tweens <> dt))
- (scene-update-entities scene (cut integrate-entity <> dt tm))
- (scene-sync-groups! scene)
- (scene-resolve-collisions scene)
- (scene-update-entities scene
- (lambda (e)
- (if (entity-ref e #:gravity? #f)
- (detect-on-solid e tm (scene-entities scene))
- e)))))))
+ (let ((tm (scene-tilemap (game-scene game))))
+ (game-scene-set! game
+ (chain (game-scene game)
+ (scene-update-entities _ (cut step-tweens <> dt))
+ (scene-update-entities _ (cut integrate-entity <> dt tm))
+ (scene-sync-groups _)
+ (scene-resolve-collisions _)
+ (scene-update-entities _
+ (lambda (e)
+ (if (entity-ref e #:gravity? #f)
+ (detect-on-solid e tm (scene-entities _))
+ e)))))))))
(game-run! *game*)
diff --git a/demo/scaling.scm b/demo/scaling.scm
index 983e583..f8bfdfb 100644
--- a/demo/scaling.scm
+++ b/demo/scaling.scm
@@ -53,7 +53,8 @@
(ny (max 0 (min (- +height+ +box-size+)
(+ (entity-ref box #:y 0) vy))))
(box (entity-set (entity-set box #:x nx) #:y ny)))
- (scene-entities-set! scene (list box))))
+ (game-scene-set! game
+ (update-scene scene entities: (list box)))))
render: (lambda (game)
(let* ((renderer (game-renderer game))
diff --git a/demo/shmup.scm b/demo/shmup.scm
index 97779a8..ab09957 100644
--- a/demo/shmup.scm
+++ b/demo/shmup.scm
@@ -61,6 +61,10 @@
(let ((y (entity-ref e #:y 0)))
(and (> y -20) (< y (+ +screen-height+ 20)))))
+(define (scene-remove-dead scene)
+ (let ((dead (find-dead (scene-entities scene))))
+ (scene-filter-entities scene (lambda (e) (not (memq e dead))))))
+
;; ── Update helpers ───────────────────────────────────────────────────────────
(define (player-vx input)
@@ -72,26 +76,27 @@
(entity-set player #:x
(max 0 (min (- +screen-width+ 16) (entity-ref player #:x 0)))))
-(define (update-player player input scene)
+(define (update-player player input)
(let ((updated (chain player
(entity-set _ #:vx (player-vx input))
(apply-velocity-x _)
(clamp-player-x _))))
(when (input-pressed? input 'a)
- (play-sound 'shoot)
- (scene-add-entity scene
- (make-bullet (+ (entity-ref updated #:x 0) 6) 340)))
- updated))
+ (play-sound 'shoot))
+ (if (input-pressed? input 'a)
+ (values updated
+ (list (make-bullet (+ (entity-ref updated #:x 0) 6) 340)))
+ (values updated '()))))
(define (move-projectile e)
(chain e
(entity-set _ #:x (+ (entity-ref e #:x 0) (entity-ref e #:vx 0)))
(entity-set _ #:y (+ (entity-ref e #:y 0) (entity-ref e #:vy 0)))))
-(define (maybe-spawn-enemy! scene)
- (when (zero? (modulo *frame-count* +spawn-interval+))
- (scene-add-entity scene
- (make-enemy (+ 20 (* (pseudo-random-integer 28) 20))))))
+(define (maybe-spawn-enemies)
+ (if (zero? (modulo *frame-count* +spawn-interval+))
+ (list (make-enemy (+ 20 (* (pseudo-random-integer 28) 20))))
+ '()))
;; ── Render ───────────────────────────────────────────────────────────────────
@@ -132,22 +137,21 @@
update: (lambda (game dt)
(set! *frame-count* (+ *frame-count* 1))
- (let* ((input (game-input game))
- (scene (game-scene game))
- (player (car (scene-entities scene)))
- (player (update-player player input scene)))
- (maybe-spawn-enemy! scene)
- ;; Replace player, then move all projectiles
- (scene-entities-set! scene
- (cons player (filter (lambda (e) (not (eq? (entity-type e) 'player)))
- (scene-entities scene))))
- (scene-update-entities scene
- (lambda (e) (if (eq? (entity-type e) 'player) e (move-projectile e))))
- ;; Remove bullet/enemy collisions, then out-of-bounds
- (let ((dead (find-dead (scene-entities scene))))
- (scene-filter-entities scene (lambda (e) (not (memq e dead)))))
- (scene-filter-entities scene
- (lambda (e) (or (eq? (entity-type e) 'player) (in-bounds? e))))))
+ (let* ((input (game-input game))
+ (scene (game-scene game))
+ (player (car (scene-entities scene))))
+ (receive (player new-entities) (update-player player input)
+ (let* ((others (filter (lambda (e) (not (eq? (entity-type e) 'player)))
+ (scene-entities scene)))
+ (spawned (maybe-spawn-enemies))
+ (all (cons player (append new-entities spawned others))))
+ (game-scene-set! game
+ (chain (update-scene scene entities: all)
+ (scene-update-entities _
+ (lambda (e) (if (eq? (entity-type e) 'player) e (move-projectile e))))
+ (scene-remove-dead _)
+ (scene-filter-entities _
+ (lambda (e) (or (eq? (entity-type e) 'player) (in-bounds? e))))))))))
render: (lambda (game)
(for-each (cut draw-shmup-entity (game-renderer game) <>)
diff --git a/demo/topdown.scm b/demo/topdown.scm
index 7e5bd62..1bf6536 100644
--- a/demo/topdown.scm
+++ b/demo/topdown.scm
@@ -43,15 +43,17 @@
title: "Demo: Top-down Explorer" width: 600 height: 400
create: (lambda (game)
- (let ((scene (game-load-scene! game "demo/assets/level-0.tmx")))
- (scene-add-entity scene (make-player))
- (scene-camera-target-set! scene 'player)))
+ (game-scene-set! game
+ (chain (game-load-scene! game "demo/assets/level-0.tmx")
+ (scene-add-entity _ (make-player))
+ (update-scene _ camera-target: 'player))))
update: (lambda (game dt)
(let* ((input (game-input game))
(scene (game-scene game))
(player (update-player (car (scene-entities scene))
input (scene-tilemap scene))))
- (scene-entities-set! scene (list player))))))
+ (game-scene-set! game
+ (update-scene scene entities: (list player)))))))
(game-run! *game*)
diff --git a/demo/tweens.scm b/demo/tweens.scm
index 7ed2372..d036b6b 100644
--- a/demo/tweens.scm
+++ b/demo/tweens.scm
@@ -82,8 +82,9 @@
background: '(26 28 34))))
update: (lambda (game dt)
- (scene-update-entities (game-scene game)
- (cut step-tweens <> dt)))
+ (game-scene-set! game
+ (scene-update-entities (game-scene game)
+ (cut step-tweens <> dt))))
render: (lambda (game)
(draw-ease-labels! (game-renderer game)