aboutsummaryrefslogtreecommitdiff
path: root/demo/animation.scm
blob: 6d8e38976bb55aedffcd5138c53dc374783b5e1e (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
(import scheme
        (chicken base)
        (only srfi-1 iota)
        (prefix sdl2 "sdl2:")
        (prefix sdl2-ttf "ttf:")
        downstroke-engine
        downstroke-world
        downstroke-renderer
        downstroke-entity
	    downstroke-prefabs
	    downstroke-scene-loader
	    downstroke-tilemap)

;; ── State ────────────────────────────────────────────────────────────────────

(define *label-font*  #f)
(define *title-font*  #f)

(define (make-demo-tilemap ts tw th gw gh)
  (let* ((ncols     (inexact->exact (ceiling (/ gw tw))))
         (nrows     (inexact->exact (ceiling (/ gh th))))
         (empty-row (map (lambda (_) 0) (iota ncols)))
         (floor-row (map (lambda (_) 20) (iota ncols)))
         (map-data  (append (map (lambda (_) empty-row) (iota (- nrows 1)))
                            (list floor-row))))
    (make-tilemap
     width: ncols height: nrows
     tilewidth: tw tileheight: th
     tileset-source: "" tileset: ts
     layers: (list (make-layer name: "ground"
                               width: ncols height: nrows
                               map: map-data))
     objects: '())))

(define (make-demo-scene game)
  (let* ((prefabs (load-prefabs "demo/assets/animation-prefabs.scm" (engine-mixins) '()))
         (ts (game-load-tileset! game 'tileset "demo/assets/monochrome_transparent.tsx"))
         (tw (tileset-tilewidth ts))
         (th (tileset-tileheight ts))
         (tex (create-texture-from-tileset (game-renderer game) ts))
         (tm (make-demo-tilemap ts tw th (game-width game) (game-height game)))
	     (entities (list (instantiate-prefab prefabs 'std-frames 80 80 tw th)
			             (instantiate-prefab prefabs 'timed-frames 220 60 tw th))))
    (make-scene
     entities: entities
     tilemap: tm
     tileset: #f
     camera: (make-camera x: 0 y: 0)
     tileset-texture: tex
     camera-target: #f
     background: '(32 34 40))))

(define *game*
  (make-game
   title: "Demo: Animation" width: 640 height: 480

   preload: (lambda (_game)
	          (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 22))
	          (set! *label-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 13)))

   create: (lambda (game)
	         (game-scene-set! game (make-demo-scene game)))))

(game-run! *game*)