From 38eee24832fe6da4f135cae455881ab97953b23a Mon Sep 17 00:00:00 2001 From: Gene Pasquet Date: Sat, 18 Apr 2026 02:47:10 +0100 Subject: Refresh docs and re-indent --- demo/animation.scm | 37 ++++--------- demo/assets/animation-prefabs.scm | 6 +-- demo/audio.scm | 68 ++++++++++++------------ demo/getting-started.scm | 50 ++++++++++++++++++ demo/menu.scm | 22 ++++---- demo/platformer.scm | 38 +++++++------- demo/sandbox.scm | 74 +++++++++++++------------- demo/scaling.scm | 108 +++++++++++++++++++------------------- demo/shmup.scm | 86 +++++++++++++++--------------- demo/spritefont.scm | 44 ++++++++-------- demo/topdown.scm | 24 ++++----- demo/tweens.scm | 66 +++++++++++------------ 12 files changed, 328 insertions(+), 295 deletions(-) create mode 100644 demo/getting-started.scm (limited to 'demo') diff --git a/demo/animation.scm b/demo/animation.scm index f2048d6..6d8e389 100644 --- a/demo/animation.scm +++ b/demo/animation.scm @@ -1,33 +1,21 @@ (import scheme (chicken base) - (chicken pretty-print) (only srfi-1 iota) - (only (list-utils alist) plist->alist) (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") downstroke-engine downstroke-world downstroke-renderer downstroke-entity - downstroke-prefabs - downstroke-scene-loader - downstroke-tilemap - downstroke-animation) + downstroke-prefabs + downstroke-scene-loader + downstroke-tilemap) ;; ── State ──────────────────────────────────────────────────────────────────── (define *label-font* #f) (define *title-font* #f) -(define (make-demo-entity x y tw th id) - (plist->alist (list #:type 'demo-bot - #:x x #:y y #:width tw #:height th - #:vx 0 #:vy 0 - #:gravity? #t #:on-ground? #f - #:solid? #t #:immovable? #f - #:tile-id 1 - #:demo-id id #:demo-since-jump 0))) - (define (make-demo-tilemap ts tw th gw gh) (let* ((ncols (inexact->exact (ceiling (/ gw tw)))) (nrows (inexact->exact (ceiling (/ gh th)))) @@ -51,11 +39,10 @@ (th (tileset-tileheight ts)) (tex (create-texture-from-tileset (game-renderer game) ts)) (tm (make-demo-tilemap ts tw th (game-width game) (game-height game))) - (entities (list (instantiate-prefab prefabs 'std-frames 80 80 tw th) - (instantiate-prefab prefabs 'timed-frames 220 60 tw th)))) - (pp entities) + (entities (list (instantiate-prefab prefabs 'std-frames 80 80 tw th) + (instantiate-prefab prefabs 'timed-frames 220 60 tw th)))) (make-scene - entities: entities + entities: entities tilemap: tm tileset: #f camera: (make-camera x: 0 y: 0) @@ -65,17 +52,13 @@ (define *game* (make-game - title: "Demo: Tweens" width: 640 height: 480 + title: "Demo: Animation" width: 640 height: 480 preload: (lambda (_game) - (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22)) - (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13))) + (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22)) + (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13))) create: (lambda (game) - (game-scene-set! game (make-demo-scene game))) - - update: (lambda (game dt) - (let ((scene (game-scene game))) - (game-scene-set! game (scene-map-entities scene (cut apply-animation <> <> dt))))))) + (game-scene-set! game (make-demo-scene game))))) (game-run! *game*) diff --git a/demo/assets/animation-prefabs.scm b/demo/assets/animation-prefabs.scm index 18aa7af..20a4106 100644 --- a/demo/assets/animation-prefabs.scm +++ b/demo/assets/animation-prefabs.scm @@ -1,6 +1,6 @@ ((mixins) (prefabs - (timed-frames animated #:type timed-frames + (timed-frames animated #:type timed-frames #:anim-name walk #:animations ((#:name walk #:frames ((28 10) (29 1000))))) - (std-frames animated #:type std-frames - #:animations ((#:name attack #:frames (28 29) #:duration 10))))) + (std-frames animated #:type std-frames #:anim-name attack + #:animations ((#:name attack #:frames (28 29) #:duration 10))))) diff --git a/demo/audio.scm b/demo/audio.scm index 62bebf4..8e3fead 100644 --- a/demo/audio.scm +++ b/demo/audio.scm @@ -15,42 +15,42 @@ (define *game* (make-game - title: "Demo: Audio" width: 600 height: 400 + title: "Demo: Audio" width: 600 height: 400 - preload: (lambda (game) - (init-audio!) - (load-sounds! '((jump . "demo/assets/jump.wav"))) - (load-music! "demo/assets/theme.ogg") - (game-asset-set! game 'font - (ttf:open-font "demo/assets/DejaVuSans.ttf" 20))) + preload: (lambda (game) + (init-audio!) + (load-sounds! '((jump . "demo/assets/jump.wav"))) + (load-music! "demo/assets/theme.ogg") + (game-asset-set! game 'font + (ttf:open-font "demo/assets/DejaVuSans.ttf" 20))) - update: (lambda (game dt) - (let ((input (game-input game))) - (when (input-pressed? input 'a) (play-sound 'jump)) - (when (input-pressed? input 'b) - (if *music-on?* - (begin (stop-music!) (set! *music-on?* #f)) - (begin (play-music! 0.5) (set! *music-on?* #t)))))) + update: (lambda (game dt) + (let ((input (game-input game))) + (when (input-pressed? input 'a) (play-sound 'jump)) + (when (input-pressed? input 'b) + (if *music-on?* + (begin (stop-music!) (set! *music-on?* #f)) + (begin (play-music! 0.5) (set! *music-on?* #t)))))) - render: (lambda (game) - (let ((renderer (game-renderer game)) - (font (game-asset game 'font)) - (white (sdl2:make-color 255 255 255 255)) - (gray (sdl2:make-color 180 180 180 255))) - (set! (sdl2:render-draw-color renderer) +bg-color+) - (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) - (draw-ui-text renderer font "Audio Demo" white 220 80) - (for-each - (lambda (entry) - (draw-ui-text renderer font (car entry) gray (cadr entry) (caddr entry))) - '(("J / Z -- play sound effect" 160 160) - ("K / X -- toggle music on/off" 160 200) - ("Escape -- quit" 160 240))) - (draw-ui-text renderer font - (if *music-on?* "Music: ON" "Music: OFF") - (if *music-on?* - (sdl2:make-color 100 255 100 255) - (sdl2:make-color 255 100 100 255)) - 240 310))))) + render: (lambda (game) + (let ((renderer (game-renderer game)) + (font (game-asset game 'font)) + (white (sdl2:make-color 255 255 255 255)) + (gray (sdl2:make-color 180 180 180 255))) + (set! (sdl2:render-draw-color renderer) +bg-color+) + (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) + (draw-ui-text renderer font "Audio Demo" white 220 80) + (for-each + (lambda (entry) + (draw-ui-text renderer font (car entry) gray (cadr entry) (caddr entry))) + '(("J / Z -- play sound effect" 160 160) + ("K / X -- toggle music on/off" 160 200) + ("Escape -- quit" 160 240))) + (draw-ui-text renderer font + (if *music-on?* "Music: ON" "Music: OFF") + (if *music-on?* + (sdl2:make-color 100 255 100 255) + (sdl2:make-color 255 100 100 255)) + 240 310))))) (game-run! *game*) diff --git a/demo/getting-started.scm b/demo/getting-started.scm new file mode 100644 index 0000000..07014d9 --- /dev/null +++ b/demo/getting-started.scm @@ -0,0 +1,50 @@ +;; Getting-started demo: a blue square you can move with arrow keys. +;; The companion walkthrough in docs/guide.org builds this file step by step. + +(import scheme + (chicken base) + (only (list-utils alist) plist->alist) + downstroke-engine + downstroke-world + downstroke-entity + downstroke-input + downstroke-scene-loader) + +(define +speed+ 2) + +(define (make-player) + (plist->alist + (list #:type 'player + #:x 150 #:y 100 + #:width 32 #:height 32 + #:color '(100 160 255)))) + +(define (move-player player input) + (let* ((x (entity-ref player #:x 0)) + (y (entity-ref player #:y 0)) + (dx (cond ((input-held? input 'left) (- +speed+)) + ((input-held? input 'right) +speed+) + (else 0))) + (dy (cond ((input-held? input 'up) (- +speed+)) + ((input-held? input 'down) +speed+) + (else 0)))) + (entity-set (entity-set player #:x (+ x dx)) #:y (+ y dy)))) + +(game-run! + (make-game + title: "Getting Started" + width: 320 height: 240 + + create: (lambda (game) + (game-scene-set! game + (make-sprite-scene + entities: (list (make-player)) + background: '(20 22 30)))) + + update: (lambda (game dt) + (let* ((scene (game-scene game)) + (input (game-input game)) + (player (car (scene-entities scene)))) + (game-scene-set! game + (update-scene scene + entities: (list (move-player player input)))))))) diff --git a/demo/menu.scm b/demo/menu.scm index 322e046..67fd655 100644 --- a/demo/menu.scm +++ b/demo/menu.scm @@ -46,23 +46,23 @@ (let ((renderer (game-renderer game))) (clear-screen! renderer) (draw-ui-text renderer *menu-font* - "PLAYING! PRESS ESC TO RETURN" +text-color+ 120 150))) + "PLAYING! PRESS ESC TO RETURN" +text-color+ 120 150))) ;; ── Game ───────────────────────────────────────────────────────────────────── (define *game* (make-game - title: "Demo: Menu System" width: 600 height: 400 + title: "Demo: Menu System" width: 600 height: 400 - preload: (lambda (game) - (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 24)) - (set! *menu-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 16))) + preload: (lambda (game) + (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 24)) + (set! *menu-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 16))) - create: (lambda (game) - (game-add-state! game 'main-menu - (make-game-state #:update main-menu-update #:render main-menu-render)) - (game-add-state! game 'playing - (make-game-state #:update playing-update #:render playing-render)) - (game-start-state! game 'main-menu)))) + create: (lambda (game) + (game-add-state! game 'main-menu + (make-game-state #:update main-menu-update #:render main-menu-render)) + (game-add-state! game 'playing + (make-game-state #:update playing-update #:render playing-render)) + (game-start-state! game 'main-menu)))) (game-run! *game*) diff --git a/demo/platformer.scm b/demo/platformer.scm index 6e854fe..c11c390 100644 --- a/demo/platformer.scm +++ b/demo/platformer.scm @@ -40,24 +40,24 @@ (define *game* (make-game - title: "Demo: Platformer" width: 600 height: 400 - debug?: +debug?+ - - preload: (lambda (game) - (init-audio!) - (load-sounds! '((jump . "demo/assets/jump.wav")))) - - create: (lambda (game) - (let* ((s0 (game-load-scene! game "demo/assets/level-0.tmx")) - (s1 (scene-add-entity s0 (make-player))) - (s2 (update-scene s1 camera-target: 'player))) - (game-scene-set! game s2))) - - update: (lambda (game dt) - (let* ((input (game-input game)) - (scene (game-scene game)) - (player (update-player (car (scene-entities scene)) input))) - (game-scene-set! game - (update-scene scene entities: (list player))))))) + title: "Demo: Platformer" width: 600 height: 400 + debug?: +debug?+ + + preload: (lambda (game) + (init-audio!) + (load-sounds! '((jump . "demo/assets/jump.wav")))) + + create: (lambda (game) + (let* ((s0 (game-load-scene! game "demo/assets/level-0.tmx")) + (s1 (scene-add-entity s0 (make-player))) + (s2 (update-scene s1 camera-target: 'player))) + (game-scene-set! game s2))) + + update: (lambda (game dt) + (let* ((input (game-input game)) + (scene (game-scene game)) + (player (update-player (car (scene-entities scene)) input))) + (game-scene-set! game + (update-scene scene entities: (list player))))))) (game-run! *game*) diff --git a/demo/sandbox.scm b/demo/sandbox.scm index ef71053..9d6b0fe 100644 --- a/demo/sandbox.scm +++ b/demo/sandbox.scm @@ -39,13 +39,13 @@ (map-data (append (map (lambda (_) empty-row) (iota (- nrows 1))) (list floor-row)))) (make-tilemap - width: ncols height: nrows - tilewidth: tw tileheight: th - tileset-source: "" tileset: ts - layers: (list (make-layer name: "ground" - width: ncols height: nrows - map: map-data)) - objects: '()))) + width: ncols height: nrows + tilewidth: tw tileheight: th + tileset-source: "" tileset: ts + layers: (list (make-layer name: "ground" + width: ncols height: nrows + map: map-data)) + objects: '()))) ;; ── Entity factories ───────────────────────────────────────────────────────── @@ -93,10 +93,10 @@ (x-left (entity-ref origin #:x 0)) (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)))) + (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) @@ -109,41 +109,41 @@ (gh (game-height game)) (tm (make-sandbox-tilemap ts tw th gw gh)) (shelf-list (attach-shelf-tween! - (instantiate-group-prefab reg 'shelf-platform - (* 10 tw) (- gh (* 6 th))) - tw)) + (instantiate-group-prefab reg 'shelf-platform + (* 10 tw) (- gh (* 6 th))) + tw)) (raft-list (instantiate-group-prefab reg 'collision-raft - 120 (- gh (* 14 th)))) + 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)))) (make-scene - entities: (append shelf-list raft-list (spawn-boxes tw th) bots) - tilemap: tm - tileset: #f - camera: (make-camera x: 0 y: 0) - tileset-texture: tex - camera-target: #f - background: '(32 34 40)))) + entities: (append shelf-list raft-list (spawn-boxes tw th) bots) + tilemap: tm + tileset: #f + camera: (make-camera x: 0 y: 0) + tileset-texture: tex + camera-target: #f + background: '(32 34 40)))) ;; ── Game ───────────────────────────────────────────────────────────────────── (define *game* (make-game - title: "Demo: Physics Sandbox" - width: +game-width+ height: +game-height+ - - create: (lambda (game) - (game-scene-set! game (make-sandbox-scene game))) - - update: (lambda (game dt) - (set! *demo-t* (+ *demo-t* dt)) - (let ((scene (game-scene game))) - (game-scene-set! game - (scene-map-entities scene - (lambda (scene_ e) - (if (eq? (entity-type e) 'demo-bot) - (update-demo-bot e dt) - e)))))))) + title: "Demo: Physics Sandbox" + width: +game-width+ height: +game-height+ + + create: (lambda (game) + (game-scene-set! game (make-sandbox-scene game))) + + update: (lambda (game dt) + (set! *demo-t* (+ *demo-t* dt)) + (let ((scene (game-scene game))) + (game-scene-set! game + (scene-map-entities scene + (lambda (scene_ e) + (if (eq? (entity-type e) 'demo-bot) + (update-demo-bot e dt) + e)))))))) (game-run! *game*) diff --git a/demo/scaling.scm b/demo/scaling.scm index 1d74e6a..e00c797 100644 --- a/demo/scaling.scm +++ b/demo/scaling.scm @@ -19,62 +19,62 @@ (define *game* (make-game - title: "Demo: Scaling (2×)" - width: +width+ height: +height+ - scale: 2 + title: "Demo: Scaling (2×)" + width: +width+ height: +height+ + scale: 2 - create: (lambda (game) - (game-scene-set! game - (make-scene - entities: (list (plist->alist (list #:type 'box - #:x (/ +width+ 2) - #:y (/ +height+ 2) - #:width +box-size+ - #:height +box-size+ - #:vx 0 #:vy 0 - #:color '(255 200 0)))) - tilemap: #f - camera: (make-camera x: 0 y: 0) - tileset-texture: #f - camera-target: #f - background: '(30 30 50) - engine-update: 'none))) + create: (lambda (game) + (game-scene-set! game + (make-scene + entities: (list (plist->alist (list #:type 'box + #:x (/ +width+ 2) + #:y (/ +height+ 2) + #:width +box-size+ + #:height +box-size+ + #:vx 0 #:vy 0 + #:color '(255 200 0)))) + tilemap: #f + camera: (make-camera x: 0 y: 0) + tileset-texture: #f + camera-target: #f + background: '(30 30 50) + engine-update: 'none))) - update: (lambda (game dt) - (let* ((input (game-input game)) - (scene (game-scene game)) - (box (car (scene-entities scene))) - (vx (cond ((input-held? input 'left) (- +speed+)) - ((input-held? input 'right) +speed+) - (else 0))) - (vy (cond ((input-held? input 'up) (- +speed+)) - ((input-held? input 'down) +speed+) - (else 0))) - (nx (max 0 (min (- +width+ +box-size+) - (+ (entity-ref box #:x 0) vx)))) - (ny (max 0 (min (- +height+ +box-size+) - (+ (entity-ref box #:y 0) vy)))) - (box (entity-set (entity-set box #:x nx) #:y ny))) - (game-scene-set! game - (update-scene scene entities: (list box))))) + update: (lambda (game dt) + (let* ((input (game-input game)) + (scene (game-scene game)) + (box (car (scene-entities scene))) + (vx (cond ((input-held? input 'left) (- +speed+)) + ((input-held? input 'right) +speed+) + (else 0))) + (vy (cond ((input-held? input 'up) (- +speed+)) + ((input-held? input 'down) +speed+) + (else 0))) + (nx (max 0 (min (- +width+ +box-size+) + (+ (entity-ref box #:x 0) vx)))) + (ny (max 0 (min (- +height+ +box-size+) + (+ (entity-ref box #:y 0) vy)))) + (box (entity-set (entity-set box #:x nx) #:y ny))) + (game-scene-set! game + (update-scene scene entities: (list box))))) - render: (lambda (game) - (let* ((renderer (game-renderer game)) - (scene (game-scene game)) - (box (car (scene-entities scene))) - (bx (inexact->exact (floor (entity-ref box #:x 0)))) - (by (inexact->exact (floor (entity-ref box #:y 0))))) - ;; Draw the colored box - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 255 200 0)) - (sdl2:render-fill-rect! renderer - (sdl2:make-rect bx by +box-size+ +box-size+)) - ;; Draw a border around the logical viewport - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 100 100 100)) - (sdl2:render-draw-rect! renderer - (sdl2:make-rect 0 0 +width+ +height+)) - ;; Draw crosshair at center - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 60 60 80)) - (sdl2:render-draw-line! renderer (/ +width+ 2) 0 (/ +width+ 2) +height+) - (sdl2:render-draw-line! renderer 0 (/ +height+ 2) +width+ (/ +height+ 2)))))) + render: (lambda (game) + (let* ((renderer (game-renderer game)) + (scene (game-scene game)) + (box (car (scene-entities scene))) + (bx (inexact->exact (floor (entity-ref box #:x 0)))) + (by (inexact->exact (floor (entity-ref box #:y 0))))) + ;; Draw the colored box + (set! (sdl2:render-draw-color renderer) (sdl2:make-color 255 200 0)) + (sdl2:render-fill-rect! renderer + (sdl2:make-rect bx by +box-size+ +box-size+)) + ;; Draw a border around the logical viewport + (set! (sdl2:render-draw-color renderer) (sdl2:make-color 100 100 100)) + (sdl2:render-draw-rect! renderer + (sdl2:make-rect 0 0 +width+ +height+)) + ;; Draw crosshair at center + (set! (sdl2:render-draw-color renderer) (sdl2:make-color 60 60 80)) + (sdl2:render-draw-line! renderer (/ +width+ 2) 0 (/ +width+ 2) +height+) + (sdl2:render-draw-line! renderer 0 (/ +height+ 2) +width+ (/ +height+ 2)))))) (game-run! *game*) diff --git a/demo/shmup.scm b/demo/shmup.scm index 15afb71..6d6ffe0 100644 --- a/demo/shmup.scm +++ b/demo/shmup.scm @@ -43,10 +43,10 @@ (define (entities-overlap? a b) (aabb-overlap? - (entity-ref a #:x 0) (entity-ref a #:y 0) - (entity-ref a #:width 0) (entity-ref a #:height 0) - (entity-ref b #:x 0) (entity-ref b #:y 0) - (entity-ref b #:width 0) (entity-ref b #:height 0))) + (entity-ref a #:x 0) (entity-ref a #:y 0) + (entity-ref a #:width 0) (entity-ref a #:height 0) + (entity-ref b #:x 0) (entity-ref b #:y 0) + (entity-ref b #:width 0) (entity-ref b #:height 0))) (define (find-dead entities) (let ((bullets (filter (lambda (e) (eq? (entity-type e) 'bullet)) entities)) @@ -75,7 +75,7 @@ (define (clamp-player-x player) (entity-set player #:x - (max 0 (min (- +screen-width+ 16) (entity-ref player #:x 0))))) + (max 0 (min (- +screen-width+ 16) (entity-ref player #:x 0))))) (define (update-player player input) (let ((updated (chain player @@ -120,43 +120,43 @@ (define *game* (make-game - title: "Demo: Shoot-em-up" - width: +screen-width+ height: +screen-height+ - - preload: (lambda (game) - (init-audio!) - (load-sounds! '((shoot . "demo/assets/jump.wav")))) - - create: (lambda (game) - (game-scene-set! game - (make-scene - entities: (list (make-player)) - tilemap: #f - camera: (make-camera x: 0 y: 0) - tileset-texture: #f - camera-target: #f - engine-update: 'none))) - - update: (lambda (game dt) - (set! *frame-count* (+ *frame-count* 1)) - (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-map-entities _ - (lambda (scene_ 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) <>) - (scene-entities (game-scene game)))))) + title: "Demo: Shoot-em-up" + width: +screen-width+ height: +screen-height+ + + preload: (lambda (game) + (init-audio!) + (load-sounds! '((shoot . "demo/assets/jump.wav")))) + + create: (lambda (game) + (game-scene-set! game + (make-scene + entities: (list (make-player)) + tilemap: #f + camera: (make-camera x: 0 y: 0) + tileset-texture: #f + camera-target: #f + engine-update: 'none))) + + update: (lambda (game dt) + (set! *frame-count* (+ *frame-count* 1)) + (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-map-entities _ + (lambda (scene_ 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) <>) + (scene-entities (game-scene game)))))) (game-run! *game*) diff --git a/demo/spritefont.scm b/demo/spritefont.scm index 2abc07a..ef70461 100644 --- a/demo/spritefont.scm +++ b/demo/spritefont.scm @@ -14,29 +14,29 @@ (define *game* (make-game - title: "Demo: Sprite Font" width: 600 height: 400 + title: "Demo: Sprite Font" width: 600 height: 400 - create: (lambda (game) - (game-load-scene! game "demo/assets/level-0.tmx") - (set! *sprite-font* - (make-sprite-font* - #:tile-size 16 #:spacing 1 - #:ranges '((#\A #\M 918) (#\N #\Z 967) (#\0 #\9 869))))) + create: (lambda (game) + (game-load-scene! game "demo/assets/level-0.tmx") + (set! *sprite-font* + (make-sprite-font* + #:tile-size 16 #:spacing 1 + #:ranges '((#\A #\M 918) (#\N #\Z 967) (#\0 #\9 869))))) - render: (lambda (game) - (let* ((scene (game-scene game)) - (renderer (game-renderer game)) - (tileset (tilemap-tileset (scene-tilemap scene))) - (texture (scene-tileset-texture scene))) - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 30 30 60 255)) - (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) - (for-each - (lambda (entry) - (draw-sprite-text renderer texture tileset *sprite-font* - (car entry) (cadr entry) (caddr entry))) - '(("HELLO WORLD" 50 50) - ("DOWNSTROKE" 100 120) - ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" 20 200) - ("0123456789" 150 280))))))) + render: (lambda (game) + (let* ((scene (game-scene game)) + (renderer (game-renderer game)) + (tileset (tilemap-tileset (scene-tilemap scene))) + (texture (scene-tileset-texture scene))) + (set! (sdl2:render-draw-color renderer) (sdl2:make-color 30 30 60 255)) + (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) + (for-each + (lambda (entry) + (draw-sprite-text renderer texture tileset *sprite-font* + (car entry) (cadr entry) (caddr entry))) + '(("HELLO WORLD" 50 50) + ("DOWNSTROKE" 100 120) + ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" 20 200) + ("0123456789" 150 280))))))) (game-run! *game*) diff --git a/demo/topdown.scm b/demo/topdown.scm index 21c7b6f..13e4cc8 100644 --- a/demo/topdown.scm +++ b/demo/topdown.scm @@ -33,19 +33,19 @@ (define *game* (make-game - title: "Demo: Top-down Explorer" width: 600 height: 400 + title: "Demo: Top-down Explorer" width: 600 height: 400 - create: (lambda (game) - (game-scene-set! game - (chain (game-load-scene! game "demo/assets/level-0.tmx") - (scene-add-entity _ (make-player)) - (update-scene _ camera-target: 'player)))) + create: (lambda (game) + (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))) - (game-scene-set! game - (update-scene scene entities: (list player))))))) + update: (lambda (game dt) + (let* ((input (game-input game)) + (scene (game-scene game)) + (player (update-player (car (scene-entities scene)) input))) + (game-scene-set! game + (update-scene scene entities: (list player))))))) (game-run! *game*) diff --git a/demo/tweens.scm b/demo/tweens.scm index 51a72b2..b56676e 100644 --- a/demo/tweens.scm +++ b/demo/tweens.scm @@ -16,7 +16,7 @@ (define +ease-syms+ '(linear quad-in quad-out quad-in-out cubic-in cubic-out cubic-in-out - sine-in-out expo-in expo-out expo-in-out back-out)) + sine-in-out expo-in expo-out expo-in-out back-out)) (define +ease-colors+ '((220 90 90) (240 140 60) (240 200 60) (180 220 70) @@ -41,50 +41,50 @@ #:color rgb #:ease-name ease-sym #:tween (make-tween base props: `((#:x . ,right)) - duration: +ease-duration+ ease: ease-sym - repeat: -1 yoyo?: #t))))) + duration: +ease-duration+ ease: ease-sym + repeat: -1 yoyo?: #t))))) ;; ── Rendering ──────────────────────────────────────────────────────────────── (define (draw-ease-labels! renderer entities) (let ((white (sdl2:make-color 255 255 255 255))) (draw-ui-text renderer *title-font* - "Tween demo - easing curves" white 12 6) + "Tween demo - easing curves" white 12 6) (draw-ui-text renderer *label-font* - "Each box ping-pongs with repeat: -1 yoyo?: #t" white 12 32) + "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))) + (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 ───────────────────────────────────────────────────────────────────── (define *game* (make-game - title: "Demo: Tweens" width: 640 height: 480 - - preload: (lambda (_game) - (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22)) - (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13))) - - create: (lambda (game) - (game-scene-set! game - (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)))) - - render: (lambda (game) - (draw-ease-labels! (game-renderer game) - (scene-entities (game-scene game)))))) + title: "Demo: Tweens" width: 640 height: 480 + + preload: (lambda (_game) + (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22)) + (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13))) + + create: (lambda (game) + (game-scene-set! game + (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)))) + + render: (lambda (game) + (draw-ease-labels! (game-renderer game) + (scene-entities (game-scene game)))))) (game-run! *game*) -- cgit v1.2.3