diff options
Diffstat (limited to 'src/game.scm')
| -rw-r--r-- | src/game.scm | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/src/game.scm b/src/game.scm index 2e3f6ee..4206533 100644 --- a/src/game.scm +++ b/src/game.scm @@ -8,8 +8,9 @@ (srfi 12) miscmacros (prefix sdl2 "sdl2:") - (prefix sdl2-ttf "ttf:") + (prefix sdl2-ttf "ttf:") (prefix sdl2-image "img:") + matchable tilemap) (define +color-depth+ 32) @@ -39,9 +40,9 @@ (if (and +vsync?+ (not +software-mode?+)) ; vsync doesn't work with software rendering (sdl2:set-hint! 'render-vsync "1")) (define *window* (sdl2:create-window! "MacroKnight" - 'centered 'centered - +screen-width+ +screen-height+ - (if *fullscreen?* '(fullscreen) '()))) + 'centered 'centered + +screen-width+ +screen-height+ + (if *fullscreen?* '(fullscreen) '()))) (define *renderer* (handle-exceptions exn @@ -59,9 +60,9 @@ (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 row-num col-num) +(define (draw-tile renderer tileset tile-id row-num col-num) (let ((tile (tileset-tile tileset tile-id))) - (sdl2:render-copy! *renderer* *level-tileset-texture* + (sdl2:render-copy! renderer *level-tileset-texture* (tile-rect tile) (sdl2:make-rect (* col-num (tileset-tileheight tileset)) (* row-num (tileset-tilewidth tileset)) @@ -75,37 +76,72 @@ (iota (length (car rows)))) (draw-tilemap-rows draw-fn (cdr rows) (+ row-num 1)))) -(define (draw-tilemap target tilemap) - (let ((map-layer (layer-map (list-ref (tilemap-layers tilemap) 0))) +(define (draw-tilemap renderer tilemap) + (let ((map-layer (layer-map (car (tilemap-layers tilemap)))) (tileset (tilemap-tileset tilemap))) (draw-tilemap-rows - (lambda (tile-id row-num col-num) (draw-tile target tileset tile-id row-num col-num)) + (lambda (tile-id row-num col-num) (draw-tile renderer tileset tile-id row-num col-num)) map-layer 0))) +(define (draw-objects renderer tilemap) + (let ((objects (tilemap-objects tilemap)) + (tileset (tilemap-tileset tilemap))) + (for-each + (cut draw-object renderer tileset <>) + objects))) + +(define (draw-object renderer tileset object) + (match (object-type object) + ("Player" (draw-player renderer tileset object)) + ("Text" (draw-text renderer tileset object)) + ("Enemy" (draw-enemy renderer tileset object)) + (_ #f))) + +(define (draw-player renderer tileset object) + (let ((col-num (inexact->exact (floor (/ (object-x object) (tileset-tilewidth tileset))))) + (row-num (inexact->exact (floor (/ (object-y object) (tileset-tileheight tileset)))))) + (draw-tile renderer tileset 29 row-num col-num))) + +(define (draw-text renderer tileset object) + (let* ((text (cdr (assoc "text" (object-properties object)))) + (text-texture (sdl2:create-texture-from-surface renderer + (ttf:render-text-solid *font* text *text-color*)))) + (sdl2:render-copy! renderer text-texture #f (sdl2:make-rect + (inexact->exact (floor (object-x object))) + (inexact->exact (floor (object-y object))) + (inexact->exact (floor (object-width object))) + (inexact->exact (floor (object-height object))))))) + +(define (draw-enemy renderer tileset object) + (let ((col-num (inexact->exact (floor (/ (object-x object) (tileset-tilewidth tileset))))) + (row-num (inexact->exact (floor (/ (object-y object) (tileset-tileheight tileset)))))) + (draw-tile renderer tileset 111 row-num col-num))) + (set! (sdl2:render-draw-color *renderer*) +background-color+) (sdl2:render-clear! *renderer*) (let/cc exit-main-loop! (while #t (set! (sdl2:render-draw-color *renderer*) +background-color+) - (sdl2:render-clear! *renderer*) + (sdl2:render-clear! *renderer*) (sdl2:pump-events!) (while (sdl2:has-events?) (let ((event (sdl2:make-event))) (sdl2:poll-event! event) - (pp event) + ;; (pp event) (when (and (sdl2:keyboard-event? event) (eq? (sdl2:event-type event) 'key-down) (eq? (sdl2:keyboard-event-sym event) 'escape)) (exit-main-loop!)))) (draw-tilemap *renderer* *level*) - + + (draw-objects *renderer* *level*) + (sdl2:render-present! *renderer*) (sdl2:delay! 10))) (sdl2:joystick-close *joystick*) (format #t "Bye!\n") - |
