aboutsummaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
Diffstat (limited to 'demo')
-rw-r--r--demo/animation.scm37
-rw-r--r--demo/assets/animation-prefabs.scm6
-rw-r--r--demo/audio.scm68
-rw-r--r--demo/getting-started.scm50
-rw-r--r--demo/menu.scm22
-rw-r--r--demo/platformer.scm38
-rw-r--r--demo/sandbox.scm74
-rw-r--r--demo/scaling.scm108
-rw-r--r--demo/shmup.scm86
-rw-r--r--demo/spritefont.scm44
-rw-r--r--demo/topdown.scm24
-rw-r--r--demo/tweens.scm66
12 files changed, 328 insertions, 295 deletions
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*)