aboutsummaryrefslogtreecommitdiff
path: root/demo/getting-started.scm
blob: 07014d9787874a646670ac25b0e04a0942a0662d (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
;; Getting-started demo: a blue square you can move with arrow keys.
;; The companion walkthrough in docs/guide.org builds this file step by step.

(import scheme
        (chicken base)
        (only (list-utils alist) plist->alist)
        downstroke-engine
        downstroke-world
        downstroke-entity
        downstroke-input
        downstroke-scene-loader)

(define +speed+ 2)

(define (make-player)
  (plist->alist
   (list #:type   'player
         #:x      150 #:y 100
         #:width  32  #:height 32
         #:color  '(100 160 255))))

(define (move-player player input)
  (let* ((x  (entity-ref player #:x 0))
         (y  (entity-ref player #:y 0))
         (dx (cond ((input-held? input 'left)  (- +speed+))
                   ((input-held? input 'right)    +speed+)
                   (else 0)))
         (dy (cond ((input-held? input 'up)    (- +speed+))
                   ((input-held? input 'down)     +speed+)
                   (else 0))))
    (entity-set (entity-set player #:x (+ x dx)) #:y (+ y dy))))

(game-run!
 (make-game
  title:  "Getting Started"
  width:  320 height: 240

  create: (lambda (game)
            (game-scene-set! game
                             (make-sprite-scene
                              entities:   (list (make-player))
                              background: '(20 22 30))))

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