(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 downstroke/scene-loader) (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 create: (lambda (game) (let ((scene (game-load-scene! game "demo/assets/level-0.tmx"))) (scene-entities-set! scene (spawn-entities)))) 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*)