aboutsummaryrefslogtreecommitdiff
path: root/demo/sandbox.scm
blob: f585a6a0b1281033efe2f05da50630adcc643749 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
(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*)