aboutsummaryrefslogtreecommitdiff
path: root/demo/topdown.scm
blob: 1bf6536a34ea735d45ad0350e9fdf00e966c5a21 (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
(import scheme
        (chicken base)
        (only srfi-197 chain)
        (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 (make-player)
  (list #:type 'player
        #:x 100 #:y 100
        #:width 16 #:height 16
        #:vx 0 #:vy 0
        #:gravity? #f
        #:tile-id 1 #:tags '(player)))

(define (input->velocity input)
  (values (+ (if (input-held? input 'left)  -3 0)
             (if (input-held? input 'right)  3 0))
          (+ (if (input-held? input 'up)    -3 0)
             (if (input-held? input 'down)   3 0))))

(define (update-player player input tm)
  (receive (dx dy) (input->velocity input)
    (chain player
           (entity-set _ #:vx dx)
           (entity-set _ #:vy dy)
           (apply-velocity-x _)
           (resolve-tile-collisions-x _ tm)
           (apply-velocity-y _)
           (resolve-tile-collisions-y _ tm))))

(define *game*
  (make-game
    title: "Demo: Top-down Explorer" width: 600 height: 400

    create: (lambda (game)
      (game-scene-set! game
        (chain (game-load-scene! game "demo/assets/level-0.tmx")
          (scene-add-entity _ (make-player))
          (update-scene _ camera-target: 'player))))

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

(game-run! *game*)