From ee937abcfeb7bd65617790936bb6ee25a2b1760a Mon Sep 17 00:00:00 2001 From: David Thompson Date: Mon, 23 Oct 2023 22:32:20 -0400 Subject: Use tagged vector for level. --- game.scm | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/game.scm b/game.scm index 74c4da8..a4c646c 100644 --- a/game.scm +++ b/game.scm @@ -446,6 +446,11 @@ (define tile-width 16.0) (define tile-height 16.0) (define level-width 15) + (define-type level + %make-level + level? + (height level-height set-level-height!) + (tiles level-tiles set-level-tiles!)) (define (make-level tiles) (let ((k (length tiles))) (unless (= (modulo k level-width) 0) @@ -478,10 +483,7 @@ (x-loop rest (+ x 1)))) tiles)) (+ y 1))))) - (vector (/ k level-width) bv)))) - (define (level-height level) - (match level - (#(height tiles) height))) + (%make-level (/ k level-width) bv)))) (define-syntax-rule (define-level name tile ...) (define name (make-level '(tile ...)))) (define-level level @@ -542,7 +544,7 @@ (* (+ (* level-width y) x) %tile-size)) (define (point-collides-with-level? level x y) (match level - (#(height tiles) + (#('level height tiles) (let ((tx (trunc (/ x tile-width))) (ty (trunc (/ y tile-height)))) (and (>= tx 0) (< tx level-width) @@ -550,7 +552,7 @@ (>= (f64-ref tiles (level-offset tx ty)) 0)))))) (define (rect-collides-with-level? level x y w h) (match level - (#(height tiles) + (#('level height tiles) (let* ((y (+ y (- (* height tile-height) game-height *scroll*))) (tx0 (trunc (/ x tile-width))) (ty0 (trunc (/ y tile-height))) @@ -566,7 +568,7 @@ (occupied? tx0 ty1)))))) (define (draw-tiles level) (match level - (#(height tiles) + (#('level height tiles) (let* ((tw tile-width) (th tile-height) (pixel-y-offset (- (* height th) *scroll* game-height)) @@ -584,10 +586,10 @@ (draw-image context image:map (* t tw) 0.0 tw th tx (- ty pixel-y-offset) tw th)))))))) - (define max-scroll (- (* (vector-ref level 0) tile-height) game-height)) + (define max-scroll (- (* (level-height level) tile-height) game-height)) (define (level-update! level) (match level - (#(height tiles) + (#('level height tiles) (let ((scroll (min (+ *scroll* *scroll-speed*) max-scroll))) (set! *scroll* scroll) (let ((row (max (- (trunc -- cgit v1.2.3