aboutsummaryrefslogtreecommitdiff
path: root/demo/platformer.scm
blob: d9276b8ab20b5495365cc458c1a66ade18bddcc0 (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
61
62
63
64
65
66
67
68
69
70
(import scheme
        (chicken base)
        (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/sound)

(define *game*
  (make-game
    title: "Demo: Platformer" width: 600 height: 400

    preload: (lambda (game)
      (init-audio!)
      (load-sounds! '((jump . "demo/assets/jump.wav")))
      (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))))
             (player (list #:type 'player
                           #:x 100 #:y 50
                           #:width 16 #:height 16
                           #:vx 0 #:vy 0
                           #:gravity? #t
                           #:on-ground? #f
                           #:tile-id 1)))
        (game-scene-set! game
          (make-scene
            entities:        (list player)
            tilemap:         tm
            camera:          (make-camera x: 0 y: 0)
            tileset-texture: tex))))

    update: (lambda (game dt)
      (let* ((input  (game-input game))
             (scene  (game-scene game))
             (tm     (scene-tilemap scene))
             (player (car (scene-entities scene)))
             (player (entity-set player #:vx
                       (cond
                         ((input-held? input 'left)  -3)
                         ((input-held? input 'right)  3)
                         (else 0))))
             (_ (when (and (input-pressed? input 'a)
                           (entity-ref player #:on-ground? #f))
                  (play-sound 'jump)))
             (player (apply-jump        player (input-pressed? input 'a)))
             (player (apply-acceleration player))
             (player (apply-gravity      player))
             (player (apply-velocity-x   player))
             (player (resolve-tile-collisions-x player tm))
             (player (apply-velocity-y   player))
             (player (resolve-tile-collisions-y player tm))
             (player (detect-ground      player tm)))
        (let ((cam-x (max 0 (- (entity-ref player #:x 0) 300))))
          (camera-x-set! (scene-camera scene) cam-x))
        (scene-entities-set! scene (list player))))))

(game-run! *game*)