aboutsummaryrefslogtreecommitdiff
path: root/demo/getting-started.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-18 02:47:10 +0100
committerGene Pasquet <dev@etenil.net>2026-04-18 02:47:10 +0100
commit38eee24832fe6da4f135cae455881ab97953b23a (patch)
treecffc2bb3b45ac11d90f4a2de3e207f65862fb6fd /demo/getting-started.scm
parenta02b892e2ad1e1605ff942c63afdd618daa48be4 (diff)
Refresh docs and re-indent
Diffstat (limited to 'demo/getting-started.scm')
-rw-r--r--demo/getting-started.scm50
1 files changed, 50 insertions, 0 deletions
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))))))))