aboutsummaryrefslogtreecommitdiff
path: root/demo/platformer.scm
blob: c11c390a2540811281907279b3d8f79040a7c865 (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
(import scheme
        (chicken base)
        (chicken process-context)
        (only (list-utils alist) plist->alist)
        (prefix sdl2 "sdl2:")
        (prefix sdl2-ttf "ttf:")
        (prefix sdl2-image "img:")
        downstroke-engine
        downstroke-world
        downstroke-input
        downstroke-physics
        downstroke-assets
        downstroke-entity
        downstroke-sound
        downstroke-scene-loader)

(define +debug?+ (and (member "--debug" (command-line-arguments)) #t))

(define (make-player)
  (plist->alist (list #:type 'player
                      #:x 100 #:y 50
                      #:width 16 #:height 16
                      #:vx 0 #:vy 0
                      #:gravity? #t #:on-ground? #f
                      #:tile-id 1 #:tags '(player))))

(define (player-vx input)
  (cond ((input-held? input 'left)  -3)
        ((input-held? input 'right)  3)
        (else 0)))

(define (update-player player input)
  (let* ((jump? (and (input-pressed? input 'a)
                     (entity-ref player #:on-ground? #f)))
         (player (entity-set player #:vx (player-vx input))))
    (when jump? (play-sound 'jump))
    (if jump?
        (entity-set player #:ay (- *jump-force*))
        player)))

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

   preload: (lambda (game)
              (init-audio!)
              (load-sounds! '((jump . "demo/assets/jump.wav"))))

   create: (lambda (game)
             (let* ((s0 (game-load-scene! game "demo/assets/level-0.tmx"))
                    (s1 (scene-add-entity s0 (make-player)))
                    (s2 (update-scene s1 camera-target: 'player)))
               (game-scene-set! game s2)))

   update: (lambda (game dt)
             (let* ((input  (game-input game))
                    (scene  (game-scene game))
                    (player (update-player (car (scene-entities scene)) input)))
               (game-scene-set! game
                                (update-scene scene entities: (list player)))))))

(game-run! *game*)