aboutsummaryrefslogtreecommitdiff
path: root/scene-loader.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-05 23:12:54 +0100
committerGene Pasquet <dev@etenil.net>2026-04-05 23:12:54 +0100
commitb99ada53b715def5492c7d04c0d327fa7048e5d3 (patch)
tree9e94dbc8ff863ef09ef18f4be31fb45e085572a4 /scene-loader.scm
parent027053b11a3a5d861ed2fa2db245388bd95ac246 (diff)
Complete implementation
Diffstat (limited to 'scene-loader.scm')
-rw-r--r--scene-loader.scm85
1 files changed, 85 insertions, 0 deletions
diff --git a/scene-loader.scm b/scene-loader.scm
new file mode 100644
index 0000000..519622e
--- /dev/null
+++ b/scene-loader.scm
@@ -0,0 +1,85 @@
+(module downstroke/scene-loader *
+ (import scheme
+ (chicken base)
+ (only srfi-1 filter-map)
+ (srfi 69)
+ (prefix sdl2 "sdl2:")
+ (prefix sdl2-ttf "ttf:")
+ defstruct
+ downstroke/tilemap
+ downstroke/world
+ downstroke/engine)
+
+ ;; Create a prefab registry from alternating symbol/constructor pairs.
+ ;; Returns a srfi-69 hash-table mapping symbols to constructor functions.
+ (define (make-prefab-registry . pairs)
+ (let ((ht (make-hash-table)))
+ (let loop ((p pairs))
+ (if (null? p) ht
+ (begin
+ (hash-table-set! ht (car p) (cadr p))
+ (loop (cddr p)))))))
+
+ ;; Instantiate a prefab by type from the registry.
+ ;; Returns the entity plist if type exists, #f otherwise.
+ (define (instantiate-prefab registry type x y w h)
+ (let ((ctor (hash-table-ref/default registry type #f)))
+ (and ctor (ctor x y w h))))
+
+ ;; 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 instantiate-fn)
+ (filter-map
+ (lambda (obj)
+ (instantiate-fn (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 the tileset image embedded in a tilemap.
+ (define (create-tileset-texture renderer tilemap)
+ (sdl2:create-texture-from-surface
+ renderer
+ (tileset-image (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
+ camera: (make-camera x: 0 y: 0)
+ tileset-texture: tex
+ camera-target: #f)))
+ (game-scene-set! game scene)
+ scene))
+
+) ;; end module