aboutsummaryrefslogtreecommitdiff
path: root/src/tilemap.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2025-10-30 00:55:37 +0000
committerGene Pasquet <dev@etenil.net>2025-11-08 04:02:10 +0000
commit9072c9bf8564e2c35d9c1b60914656b979d1b2bc (patch)
tree4d41dd2c3d27b296a0ec8fbd6ebb7564a3f1d79d /src/tilemap.scm
parent6beb72810fda95b8b2e6f549a6c110604351448a (diff)
render the tileset
Diffstat (limited to 'src/tilemap.scm')
-rw-r--r--src/tilemap.scm46
1 files changed, 34 insertions, 12 deletions
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)