diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | src/game.scm | 31 | ||||
| -rw-r--r-- | src/tilemap.scm | 46 |
4 files changed, 65 insertions, 19 deletions
@@ -2,4 +2,5 @@ .\#* *~ /bin/ -*.import.scm
\ No newline at end of file +*.import.scm +*.o @@ -1,11 +1,11 @@ bin/game: bin tilemap.import.scm - csc -o bin/game src/game.scm + csc -o bin/game bin/tilemap.o -uses tilemap src/game.scm bin: mkdir bin tilemap.import.scm: bin src/tilemap.scm - csc -c -o bin/tilemap.o -j tilemap src/tilemap.scm + csc -c -J src/tilemap.scm -unit tilemap -o bin/tilemap.o .PHONY: clean: diff --git a/src/game.scm b/src/game.scm index 1e9da8b..f9f6b56 100644 --- a/src/game.scm +++ b/src/game.scm @@ -5,6 +5,7 @@ (chicken condition) (chicken pretty-print) (srfi 1) + (srfi 12) miscmacros (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") @@ -41,8 +42,16 @@ 'centered 'centered +screen-width+ +screen-height+ (if *fullscreen?* '(fullscreen) '()))) -(define *renderer* (sdl2:create-renderer! *window* -1 - (if +software-mode?+ '(software) '(accelerated)))) + +;; (define *renderer* +;; (with-handlers [(lambda (c) +;; (display "Failed to initialise renderer") +;; (sdl2:create-renderer! *window* -1 +;; '(software)))] +;; (sdl2:create-renderer! *window* -1 +;; (if +software-mode?+ '(software) '(accelerated))))) + +(define *renderer* (sdl2:create-renderer! *window* -1 '(software))) (define *font* (ttf:open-font "DejaVuSans.ttf" 12)) (define *text-color* (sdl2:make-color 255 255 255)) @@ -51,9 +60,22 @@ (sdl2:joystick-open! 0) #f)) (define *level* (load-tilemap "assets/level-0.tmx")) +(define *level-tileset-texture* (sdl2:create-texture-from-surface *renderer* (tileset-image (tilemap-tileset *level*)))) (define (draw-tile target tileset tile-id) - 123) + (let ((tile (tileset-tile tileset tile-id))) + (sdl2:render-copy! *renderer* *level-tileset-texture* + (tile-rect tile) (tile-rect tile)))) + +(define (draw-tilemap-row draw-fn rows) + (unless (null? rows) + (map draw-fn (car rows)) + (draw-tilemap-row draw-fn (cdr rows)))) + +(define (draw-tilemap target tilemap) + (let ((map-layer (layer-map (list-ref (tilemap-layers tilemap) 0))) + (tileset (tilemap-tileset tilemap))) + (draw-tilemap-row (lambda (tile-id) (draw-tile target tileset tile-id)) map-layer))) (set! (sdl2:render-draw-color *renderer*) +background-color+) (sdl2:render-clear! *renderer*) @@ -72,8 +94,9 @@ (eq? (sdl2:keyboard-event-sym event) 'escape)) (exit-main-loop!)))) + (draw-tilemap *renderer* *level*) + (sdl2:render-present! *renderer*) - (sdl2:delay! 10))) (sdl2:joystick-close *joystick*) 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) |
