aboutsummaryrefslogtreecommitdiff
path: root/scene-loader.scm
blob: c5f8947a80095f8502bbe6af03c32afeb915e09b (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(module downstroke-scene-loader *
(import scheme
        (chicken base)
        (only srfi-1 filter-map)
        (prefix sdl2 "sdl2:")
        (prefix sdl2-ttf "ttf:")
        defstruct
        downstroke-tilemap
        downstroke-world
        downstroke-assets
        downstroke-engine
        downstroke-prefabs)


;; Convert TMX object list to entities.
;; Object types are strings from XML; convert to symbols before instantiating.
;; Filters out #f results (objects without registered prefabs).
(define (tilemap-objects->entities tilemap registry)
  (filter-map
   (lambda (obj)
     (instantiate-prefab registry
                         (string->symbol (object-type obj))
                         (object-x obj) (object-y obj)
                         (object-width obj) (object-height obj)))
   (tilemap-objects tilemap)))

;; Create an SDL2 texture from a tileset's embedded image surface.
(define (create-texture-from-tileset renderer tileset)
  (sdl2:create-texture-from-surface renderer (tileset-image tileset)))

;; Create an SDL2 texture from the tileset image embedded in a tilemap.
(define (create-tileset-texture renderer tilemap)
  (create-texture-from-tileset renderer (tilemap-tileset tilemap)))

;; Load a TMX tilemap file and store it in the game asset registry.
;; Returns the loaded tilemap struct.
(define (game-load-tilemap! game key filename)
  (let ((tm (load-tilemap filename)))
    (game-asset-set! game key tm)
    tm))

;; Load a TSX tileset file and store it in the game asset registry.
;; Returns the loaded tileset struct.
(define (game-load-tileset! game key filename)
  (let ((ts (load-tileset filename)))
    (game-asset-set! game key ts)
    ts))

;; Load a TTF font file and store it in the game asset registry.
;; size is the point size. Returns the loaded font.
(define (game-load-font! game key filename size)
  (let ((font (ttf:open-font filename size)))
    (game-asset-set! game key font)
    font))

;; Load a scene from a TMX tilemap file.
;; 1. Loads the tilemap from the file (and stores in assets)
;; 2. Creates a texture from the tilemap's tileset image
;; 3. Creates a scene with empty entities list
;; 4. Sets the scene on the game
;; Returns the scene.
(define (game-load-scene! game filename)
  (let* ((tm    (game-load-tilemap! game 'tilemap filename))
         (tex   (create-tileset-texture (game-renderer game) tm))
         (scene (make-scene
                 entities:        '()
                 tilemap:         tm
                 tileset:         #f
                 camera:          (make-camera x: 0 y: 0)
                 tileset-texture: tex
                 camera-target:   #f)))
    (game-scene-set! game scene)
    scene))

;; Build a tilemap-less scene driven only by a tileset (for sprite-only
;; demos/games that don't need a TMX map). Any keyword accepted by
;; make-scene can be passed via #!rest to override defaults.
(define (make-sprite-scene #!key
                           (entities        '())
                           (tileset         #f)
                           (tileset-texture #f)
                           (camera          (make-camera x: 0 y: 0))
                           (camera-target   #f)
                           (background      #f)
                           (engine-update   #f))
  (make-scene
   entities:        entities
   tilemap:         #f
   tileset:         tileset
   camera:          camera
   tileset-texture: tileset-texture
   camera-target:   camera-target
   background:      background
   engine-update:   engine-update))

) ;; end module