diff options
| author | Gene Pasquet <dev@etenil.net> | 2025-06-28 06:20:20 +0100 |
|---|---|---|
| committer | Gene Pasquet <dev@etenil.net> | 2025-06-28 06:20:20 +0100 |
| commit | 114a81a7761e098ea34e2a4c27a0ec6e384c720d (patch) | |
| tree | c212e1addcfffeac04ed5881d2003293cf3f5dd2 | |
| parent | 0c5d45bec2d061991c627b66ad6acad05fbdddeb (diff) | |
A little bit of progess
| -rw-r--r-- | src/tilemap.scm | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/src/tilemap.scm b/src/tilemap.scm index 49c98e2..52d1057 100644 --- a/src/tilemap.scm +++ b/src/tilemap.scm @@ -4,6 +4,8 @@ (chicken io) (chicken base) (chicken string) + (chicken process-context) + (chicken pathname) (chicken pretty-print) (srfi 1) expat @@ -15,6 +17,7 @@ spacing tilecount columns + image-source image) (defstruct layer @@ -37,6 +40,7 @@ height tilewidth tileheight + tileset-source tileset layers objects) @@ -58,6 +62,31 @@ (maybe-string->number (cdr pair)))) string-alist)) +(define (parse-tileset string-tileset) + (let ((parser (expat:make-parser)) + (tags '()) + (tileset (make-tileset 0 0 0 0 0 ""))) + (expat:set-start-handler! parser + (lambda (tag attrs) + (let ((symbol-attrs (string-alist->alist attrs))) + (cond ((string=? tag "tileset") + (set! tileset (alist->tileset symbol-attrs))) + ((string=? tag "image") + (tileset-image-source-set! tileset (alist-ref 'source symbol-attrs))))) + (set! tags (cons tag tags)))) + (expat:set-end-handler! parser (lambda (tag) + (set! tags (cdr tags)))) + (expat:set-character-data-handler! parser (lambda (line) #f)) + (expat:parse parser string-tileset) + tileset)) + +(define (load-tileset file-name) + (call-with-input-file file-name + (lambda (port) + (parse-tileset (read-string #f port)) + ;; Load up the image from SDL. + ))) + (define (parse-tilemap string-tilemap) (let ((parser (expat:make-parser)) (tags '()) @@ -72,7 +101,7 @@ (tilemap-tilewidth-set! tilemap (alist-ref 'tilewidth symbol-attrs)) (tilemap-tileheight-set! tilemap (alist-ref 'tileheight symbol-attrs))) ((string=? tag "tileset") - (tilemap-tileset-set! tilemap (alist->tileset symbol-attrs))) + (tilemap-tileset-source-set! tilemap (alist-ref 'source symbol-attrs))) ((string=? tag "layer") (set! layer (alist->layer attrs))) ((string=? tag "object") @@ -99,13 +128,21 @@ (define (load-tilemap file-name) (call-with-input-file file-name (lambda (port) - (parse-tilemap (read-string port)) - ;; TODO: Open and parse the tileset + (let ((tilemap (parse-tilemap (read-string #f port)))) + (tilemap-tileset-set! tilemap (load-tileset (tilemap-tileset-source tilemap)))) + ))) (when #f (let ((txt "<?xml version='1.0' encoding='UTF-8'?> +<tileset version='1.10' tiledversion='1.11.2' name='monochrome_transparent' tilewidth='16' tileheight='16' spacing='1' tilecount='1078' columns='49'> + <image source='monochrome-transparent.png' width='832' height='373'/> +</tileset> +")) + (tileset-image (parse-tileset txt))) + + (let ((txt "<?xml version='1.0' encoding='UTF-8'?> <map version='1.10' tiledversion='1.11.0' orientation='orthogonal' renderorder='right-down' width='40' height='30' tilewidth='16' tileheight='16' infinite='0' nextlayerid='8' nextobjectid='5'> <tileset firstgid='1' source='monochrome_transparent.tsx'/> <layer id='3' name='ground' width='40' height='30'> @@ -125,9 +162,14 @@ </objectgroup> </map> ")) - (tileset-source (tilemap-tileset (parse-tilemap txt)))) - + (tilemap-tileset (parse-tilemap txt))) + + (load-tilemap "assets/level-0.tmx") + + (current-directory) ) + + ) ;; End tilemap module |
