aboutsummaryrefslogtreecommitdiff
path: root/scene-loader.scm
blob: 387bf38c66359357428600ad32e47873d683780e (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
(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))

) ;; end module