From 9072c9bf8564e2c35d9c1b60914656b979d1b2bc Mon Sep 17 00:00:00 2001 From: Gene Pasquet Date: Thu, 30 Oct 2025 00:55:37 +0000 Subject: render the tileset --- src/tilemap.scm | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) (limited to 'src/tilemap.scm') diff --git a/src/tilemap.scm b/src/tilemap.scm index e80978e..d789422 100644 --- a/src/tilemap.scm +++ b/src/tilemap.scm @@ -1,5 +1,5 @@ (module tilemap -(load-tilemap) +* (import scheme (chicken io) (chicken base) @@ -11,7 +11,8 @@ (srfi 1) expat defstruct - (prefix sdl2-image "img:")) + (prefix sdl2-image "img:") + (prefix sdl2 "sdl2:")) (defstruct tileset tilewidth @@ -47,6 +48,10 @@ layers objects) +(defstruct tile + id + rect) + (define (maybe-do action) (lambda (value) (if (eq? value #f) @@ -61,7 +66,7 @@ (define (string-alist->alist string-alist) (map (lambda (pair) (cons (string->symbol (car pair)) - (maybe-string->number (cdr pair)))) + (maybe-string->number (cdr pair)))) string-alist)) (define (parse-tileset string-tileset) @@ -86,15 +91,15 @@ (call-with-input-file file-name (lambda (port) (let* ((tileset (parse-tileset (read-string #f port))) - (image-source (tileset-image-source tileset)) - (base-path (pathname-directory file-name)) - (img-to-load (if (absolute-pathname? image-source) - image-source - (pathname-replace-directory - image-source - (if (pathname-directory image-source) - (format "~a/~a" base-path (pathname-directory image-source)) - base-path))))) + (image-source (tileset-image-source tileset)) + (base-path (pathname-directory file-name)) + (img-to-load (if (absolute-pathname? image-source) + image-source + (pathname-replace-directory + image-source + (if (pathname-directory image-source) + (format "~a/~a" base-path (pathname-directory image-source)) + base-path))))) (tileset-image-set! tileset (img:load img-to-load)) tileset)))) @@ -136,6 +141,23 @@ (expat:parse parser string-tilemap) tilemap)) +(define (tileset-rows tileset) + "Return the number of rows in the tileset" + (inexact->exact (ceiling (/ (tileset-tilecount tileset) (tileset-columns tileset))))) + +(define (tileset-tile tileset tile-id) + ;; Use the tileset's columns setting and the tileheight/tilewidth to + ;; find the tile's x,y location and create a rect + (let* ((tile-width (tileset-tilewidth tileset)) + (tile-height (tileset-tileheight tileset)) + (tile-x (modulo tile-id (tileset-columns tileset))) + (tile-y (inexact->exact (floor (/ tile-id (tileset-columns tileset))))) + (x (* tile-x tile-width)) + (y (* tile-y tile-height))) + (make-tile + tile-id + (sdl2:make-rect x y tile-width tile-height)))) + (define (load-tilemap file-name) (call-with-input-file file-name (lambda (port) -- cgit v1.2.3