aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--Makefile4
-rw-r--r--src/game.scm31
-rw-r--r--src/tilemap.scm46
4 files changed, 65 insertions, 19 deletions
diff --git a/.gitignore b/.gitignore
index da79dbd..77b775d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@
.\#*
*~
/bin/
-*.import.scm \ No newline at end of file
+*.import.scm
+*.o
diff --git a/Makefile b/Makefile
index ef91e97..40e2a0e 100644
--- a/Makefile
+++ b/Makefile
@@ -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)