aboutsummaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-08 01:05:50 +0100
committerGene Pasquet <dev@etenil.net>2026-04-08 01:05:50 +0100
commit995342fb74fdd1ba5aeaa172a428538e7dd0dcdc (patch)
tree82a60034eaa097191d360fe07e4ef3a52dae9c2a /demo
parent0c3a700aa94a0256c5e5b1a14819f10b3d3e869b (diff)
Code cleanup
Diffstat (limited to 'demo')
-rw-r--r--demo/sandbox.scm58
-rw-r--r--demo/tweens.scm175
2 files changed, 48 insertions, 185 deletions
diff --git a/demo/sandbox.scm b/demo/sandbox.scm
index d7bd53f..f757c7f 100644
--- a/demo/sandbox.scm
+++ b/demo/sandbox.scm
@@ -27,41 +27,7 @@
;; ── Mutable demo state ──────────────────────────────────────────────────────
-(define *demo-t* 0.0)
-(define *shelf-endpoints* #f)
-(define *shelf-tween* #f)
-(define *shelf-origin* #f)
-
-;; ── Tween helpers ────────────────────────────────────────────────────────────
-
-(define (other-endpoint x endpoints)
- (let ((lo (car endpoints))
- (hi (cdr endpoints)))
- (if (< (abs (- x lo)) (abs (- x hi))) hi lo)))
-
-(define (make-ping-pong-tween leader endpoints)
- (make-tween leader
- props: `((#:x . ,(other-endpoint (entity-ref leader #:x 0) endpoints)))
- duration: 3500 ease: 'sine-in-out))
-
-(define (scene-replace-group-origin! scene gid new-origin)
- (scene-entities-set! scene
- (map (lambda (e)
- (if (and (entity-ref e #:group-origin? #f)
- (eq? (entity-ref e #:group-id) gid))
- new-origin
- e))
- (scene-entities scene))))
-
-(define (advance-shelf-tween! scene dt)
- (when (and *shelf-tween* *shelf-origin*)
- (let ((gid (entity-ref *shelf-origin* #:group-id)))
- (receive (tw2 e0) (tween-step *shelf-tween* *shelf-origin* dt)
- (set! *shelf-tween* (if (tween-finished? tw2)
- (make-ping-pong-tween e0 *shelf-endpoints*)
- tw2))
- (set! *shelf-origin* e0)
- (scene-replace-group-origin! scene gid e0)))))
+(define *demo-t* 0.0)
;; ── Tilemap builder ──────────────────────────────────────────────────────────
@@ -143,13 +109,16 @@
;; ── Scene builder ───────────────────────────────────────────────────────────
-(define (init-shelf-tween! shelf-list tw)
+(define (attach-shelf-tween! shelf-list tw)
(let* ((origin (car shelf-list))
(x-left (entity-ref origin #:x 0))
- (x-right (+ x-left (* 6 tw))))
- (set! *shelf-origin* origin)
- (set! *shelf-endpoints* (cons x-left x-right))
- (set! *shelf-tween* (make-ping-pong-tween origin *shelf-endpoints*))))
+ (x-right (+ x-left (* 6 tw)))
+ (tweened (entity-set origin #:tween
+ (make-tween origin
+ props: `((#:x . ,x-right))
+ duration: 3500 ease: 'sine-in-out
+ repeat: -1 yoyo?: #t))))
+ (cons tweened (cdr shelf-list))))
(define (make-sandbox-scene game)
(let* ((reg (load-prefabs "demo/assets/sandbox-groups.scm" (engine-mixins) '()))
@@ -160,14 +129,15 @@
(gw (game-width game))
(gh (game-height game))
(tm (make-sandbox-tilemap ts tw th gw gh))
- (shelf-list (instantiate-group-prefab reg 'shelf-platform
- (* 10 tw) (- gh (* 6 th))))
+ (shelf-list (attach-shelf-tween!
+ (instantiate-group-prefab reg 'shelf-platform
+ (* 10 tw) (- gh (* 6 th)))
+ tw))
(raft-list (instantiate-group-prefab reg 'collision-raft
120 (- gh (* 14 th))))
(bots (list (make-demo-bot 80 80 tw th 0)
(make-demo-bot 220 60 tw th 1)
(make-demo-bot 380 100 tw th 2))))
- (init-shelf-tween! shelf-list tw)
(make-scene
entities: (append shelf-list raft-list (spawn-boxes tw th) bots)
tilemap: tm
@@ -191,7 +161,7 @@
(set! *demo-t* (+ *demo-t* dt))
(let* ((scene (game-scene game))
(tm (scene-tilemap scene)))
- (advance-shelf-tween! scene dt)
+ (scene-update-entities scene (lambda (e) (step-tweens e dt)))
(scene-update-entities scene (lambda (e) (integrate-entity e dt tm)))
(scene-sync-groups! scene)
(scene-resolve-collisions scene)
diff --git a/demo/tweens.scm b/demo/tweens.scm
index 34c7759..a286a49 100644
--- a/demo/tweens.scm
+++ b/demo/tweens.scm
@@ -1,23 +1,17 @@
(import scheme
(chicken base)
(only srfi-1 iota)
- (only srfi-197 chain)
(prefix sdl2 "sdl2:")
(prefix sdl2-ttf "ttf:")
downstroke-engine
downstroke-world
downstroke-renderer
- downstroke-physics
downstroke-entity
downstroke-tween)
;; ── Constants ────────────────────────────────────────────────────────────────
(define +ease-duration+ 2600)
-(define +knock-cooldown-ms+ 3200)
-(define +knock-distance+ 88)
-(define +knock-duration+ 650)
-(define +knock-skip+ '(jump acceleration gravity velocity-x velocity-y))
(define +ease-syms+
'(linear quad-in quad-out quad-in-out cubic-in cubic-out cubic-in-out
@@ -30,127 +24,39 @@
;; ── State ────────────────────────────────────────────────────────────────────
-(define *ease-cells* #f) ; vector of #(ent tw left right ease-sym to-right?)
-(define *knock-ent* #f)
-(define *knock-tw* #f)
-(define *knock-cd* 0)
(define *label-font* #f)
(define *title-font* #f)
;; ── Ease grid ────────────────────────────────────────────────────────────────
-(define (make-ease-cell ease-sym y rgb)
+(define (make-ease-entity ease-sym y rgb)
(let* ((left 20)
(right (+ left 120))
- (ent (list #:type 'tween-demo #:x left #:y y
- #:width 14 #:height 14
- #:vx 0 #:vy 0 #:gravity? #f #:solid? #f #:color rgb))
- (tw (make-tween ent props: `((#:x . ,right))
- duration: +ease-duration+ ease: ease-sym)))
- (vector ent tw left right ease-sym #t)))
-
-(define (advance-ease-cell! cell dt)
- (let ((ent (vector-ref cell 0))
- (tw (vector-ref cell 1))
- (left (vector-ref cell 2))
- (right (vector-ref cell 3))
- (ease (vector-ref cell 4))
- (to-right? (vector-ref cell 5)))
- (receive (tw2 ent2) (tween-step tw ent dt)
- (vector-set! cell 0 ent2)
- (if (tween-finished? tw2)
- (let* ((next-dir (not to-right?))
- (target (if next-dir right left)))
- (vector-set! cell 1 (make-tween ent2 props: `((#:x . ,target))
- duration: +ease-duration+ ease: ease))
- (vector-set! cell 5 next-dir))
- (vector-set! cell 1 tw2)))))
-
-;; ── Knockback crate ──────────────────────────────────────────────────────────
-
-(define (run-physics e tm)
- (chain e
- (apply-jump _ #f)
- (apply-acceleration _)
- (apply-gravity _)
- (apply-velocity-x _)
- (resolve-tile-collisions-x _ tm)
- (apply-velocity-y _)
- (resolve-tile-collisions-y _ tm)
- (detect-on-solid _ tm)))
-
-(define (clamp-entity-to-screen e gw gh)
- (let* ((w (entity-ref e #:width 0))
- (h (entity-ref e #:height 0))
- (x (entity-ref e #:x 0))
- (y (entity-ref e #:y 0))
- (nx (max 0 (min (- gw w) x)))
- (ny (max 0 (min (- gh h) y)))
- (on-floor? (and (entity-ref e #:gravity? #f) (= ny (- gh h)))))
- (chain e
- (entity-set _ #:x nx)
- (entity-set _ #:y ny)
- (entity-set _ #:vx (if (= nx x) (entity-ref e #:vx 0) 0))
- (entity-set _ #:vy (if (= ny y) (entity-ref e #:vy 0) 0))
- (entity-set _ #:on-ground? on-floor?))))
-
-(define (run-physics-no-tilemap e gw gh)
- (chain e
- (apply-jump _ #f)
- (apply-acceleration _)
- (apply-gravity _)
- (apply-velocity-x _)
- (apply-velocity-y _)
- (clamp-entity-to-screen _ gw gh)))
-
-(define (maybe-start-knockback!)
- (when (and *knock-ent* (not *knock-tw*) (>= *knock-cd* +knock-cooldown-ms+))
- (set! *knock-cd* 0)
- (let ((x (entity-ref *knock-ent* #:x 0)))
- (set! *knock-ent* (entity-set *knock-ent* #:skip-pipelines +knock-skip+))
- (set! *knock-tw*
- (make-tween *knock-ent*
- props: `((#:x . ,(+ x +knock-distance+)))
- duration: +knock-duration+
- ease: 'back-out
- on-complete: (lambda (e)
- (set! *knock-ent* (entity-set e #:skip-pipelines '()))))))))
-
-(define (advance-knockback-tween! dt)
- (when *knock-tw*
- (receive (t2 e2) (tween-step *knock-tw* *knock-ent* dt)
- (set! *knock-tw* (if (tween-finished? t2) #f t2))
- (set! *knock-ent* e2))))
-
-(define (update-knockback! dt tm gw gh)
- (set! *knock-cd* (+ *knock-cd* dt))
- (maybe-start-knockback!)
- (advance-knockback-tween! dt)
- (when *knock-ent*
- (set! *knock-ent*
- (if tm
- (run-physics *knock-ent* tm)
- (run-physics-no-tilemap *knock-ent* gw gh)))))
+ (base (list #:x left #:y y)))
+ (list #:type 'tween-demo #:x left #:y y
+ #:width 14 #:height 14
+ #:vx 0 #:vy 0 #:gravity? #f #:solid? #f
+ #:color rgb
+ #:ease-name ease-sym
+ #:tween (make-tween base props: `((#:x . ,right))
+ duration: +ease-duration+ ease: ease-sym
+ repeat: -1 yoyo?: #t))))
;; ── Rendering ────────────────────────────────────────────────────────────────
-(define (draw-ease-labels! renderer)
+(define (draw-ease-labels! renderer entities)
(let ((white (sdl2:make-color 255 255 255 255)))
(draw-ui-text renderer *title-font*
- "Tween demo - easing rows + knockback / skip-pipelines" white 12 6)
+ "Tween demo - easing curves" white 12 6)
(draw-ui-text renderer *label-font*
- "Each box loops on X; bottom crate tweens right with physics skipped, screen bounds only."
- white 12 32)
- (do ((i 0 (+ i 1))) ((>= i (vector-length *ease-cells*)))
- (let* ((cell (vector-ref *ease-cells* i))
- (ent (vector-ref cell 0))
- (lab (symbol->string (vector-ref cell 4))))
- (draw-ui-text renderer *label-font* lab white
- 158 (- (entity-ref ent #:y 0) 2))))))
-
-(define (ease-cell-entities)
- (map (lambda (i) (vector-ref (vector-ref *ease-cells* i) 0))
- (iota (vector-length *ease-cells*))))
+ "Each box ping-pongs with repeat: -1 yoyo?: #t" white 12 32)
+ (for-each
+ (lambda (e)
+ (let ((name (entity-ref e #:ease-name #f)))
+ (when name
+ (draw-ui-text renderer *label-font* (symbol->string name) white
+ 158 (- (entity-ref e #:y 0) 2)))))
+ entities)))
;; ── Game ─────────────────────────────────────────────────────────────────────
@@ -163,37 +69,24 @@
(set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13)))
create: (lambda (game)
- (set! *ease-cells*
- (list->vector
- (map (lambda (ease i)
- (make-ease-cell ease (+ 52 (* i 20)) (list-ref +ease-colors+ i)))
- +ease-syms+ (iota (length +ease-syms+)))))
- (set! *knock-ent*
- (list #:type 'knock-crate #:x 200 #:y 80
- #:width 18 #:height 18
- #:vx 0 #:vy 0 #:gravity? #t #:on-ground? #f #:solid? #f
- #:color '(140 110 70)))
- (set! *knock-tw* #f)
- (set! *knock-cd* 2500)
(game-scene-set! game
- (make-scene entities: (append (ease-cell-entities) (list *knock-ent*))
- tilemap: #f
- camera: (make-camera x: 0 y: 0)
- tileset-texture: #f
- camera-target: #f
- background: '(26 28 34))))
+ (make-scene
+ entities: (map (lambda (ease i)
+ (make-ease-entity ease (+ 52 (* i 20))
+ (list-ref +ease-colors+ i)))
+ +ease-syms+ (iota (length +ease-syms+)))
+ tilemap: #f
+ camera: (make-camera x: 0 y: 0)
+ tileset-texture: #f
+ camera-target: #f
+ background: '(26 28 34))))
update: (lambda (game dt)
- (let ((tm (scene-tilemap (game-scene game)))
- (gw (game-width game))
- (gh (game-height game)))
- (do ((i 0 (+ i 1))) ((>= i (vector-length *ease-cells*)))
- (advance-ease-cell! (vector-ref *ease-cells* i) dt))
- (update-knockback! dt tm gw gh)
- (scene-entities-set! (game-scene game)
- (append (ease-cell-entities) (list *knock-ent*)))))
+ (scene-update-entities (game-scene game)
+ (lambda (e) (step-tweens e dt))))
render: (lambda (game)
- (draw-ease-labels! (game-renderer game)))))
+ (draw-ease-labels! (game-renderer game)
+ (scene-entities (game-scene game))))))
(game-run! *game*)