diff options
Diffstat (limited to 'scene-loader.scm')
| -rw-r--r-- | scene-loader.scm | 85 |
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 |
