aboutsummaryrefslogtreecommitdiff
path: root/demo/sandbox.scm
diff options
context:
space:
mode:
Diffstat (limited to 'demo/sandbox.scm')
-rw-r--r--demo/sandbox.scm71
1 files changed, 71 insertions, 0 deletions
diff --git a/demo/sandbox.scm b/demo/sandbox.scm
new file mode 100644
index 0000000..1be3968
--- /dev/null
+++ b/demo/sandbox.scm
@@ -0,0 +1,71 @@
+(import scheme
+ (chicken base)
+ (chicken random)
+ (prefix sdl2 "sdl2:")
+ (prefix sdl2-ttf "ttf:")
+ (prefix sdl2-image "img:")
+ downstroke/engine
+ downstroke/world
+ downstroke/tilemap
+ downstroke/renderer
+ downstroke/input
+ downstroke/physics
+ downstroke/assets
+ downstroke/entity)
+
+(define *elapsed* 0)
+(define *respawn-interval* 10000)
+
+(define (spawn-entities)
+ (let loop ((i 0) (acc '()))
+ (if (= i 10)
+ acc
+ (loop (+ i 1)
+ (cons (list #:type 'box
+ #:x (+ 30 (* i 55))
+ #:y (+ 10 (* (pseudo-random-integer 4) 20))
+ #:width 16 #:height 16
+ #:vx 0 #:vy 0
+ #:gravity? #t
+ #:on-ground? #f
+ #:solid? #t
+ #:tile-id 1)
+ acc)))))
+
+(define *game*
+ (make-game
+ title: "Demo: Physics Sandbox" width: 600 height: 400
+
+ preload: (lambda (game)
+ (game-asset-set! game 'tilemap
+ (load-tilemap "demo/assets/level-0.tmx")))
+
+ create: (lambda (game)
+ (let* ((tm (game-asset game 'tilemap))
+ (tex (sdl2:create-texture-from-surface
+ (game-renderer game)
+ (tileset-image (tilemap-tileset tm)))))
+ (game-scene-set! game
+ (make-scene
+ entities: (spawn-entities)
+ tilemap: tm
+ camera: (make-camera x: 0 y: 0)
+ tileset-texture: tex))))
+
+ update: (lambda (game dt)
+ (let* ((scene (game-scene game))
+ (tm (scene-tilemap scene)))
+ (set! *elapsed* (+ *elapsed* dt))
+ (when (>= *elapsed* *respawn-interval*)
+ (set! *elapsed* 0)
+ (scene-entities-set! scene (spawn-entities)))
+ (scene-update-entities scene
+ apply-gravity
+ apply-velocity-x
+ (lambda (e) (resolve-tile-collisions-x e tm))
+ apply-velocity-y
+ (lambda (e) (resolve-tile-collisions-y e tm))
+ (lambda (e) (detect-ground e tm)))
+ (scene-resolve-collisions scene)))))
+
+(game-run! *game*)