From bb4d2df5f574c0456f763b2bb6febb21a1e36374 Mon Sep 17 00:00:00 2001 From: Juliana Sims Date: Thu, 23 May 2024 16:08:25 -0400 Subject: [PATCH] Rotate logic gate sprites based on direction. --- game.js | 3 +++ game.scm | 15 ++++++++++++++- modules/dom/canvas.scm | 12 ++++++++++++ modules/game/levels/level-4.tmx | 2 +- modules/math.scm | 6 +++--- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/game.js b/game.js index 356789c..bdd4152 100644 --- a/game.js +++ b/game.js @@ -67,8 +67,11 @@ window.addEventListener("load", async () => { fillRect: (ctx, x, y, w, h) => ctx.fillRect(x, y, w, h), fillText: (ctx, text, x, y) => ctx.fillText(text, x, y), drawImage: (ctx, image, sx, sy, sw, sh, dx, dy, dw, dh) => ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh), + restore: (ctx) => ctx.restore(), + save: (ctx) => ctx.save(), scale: (ctx, sx, sy) => ctx.scale(sx, sy), translate: (ctx, x, y) => ctx.translate(x, y), + rotate: (ctx, angle) => ctx.rotate(angle), setTransform: (ctx, a, b, c, d, e, f) => ctx.setTransform(a, b, c, d, e, f), setImageSmoothingEnabled: (ctx, enabled) => ctx.imageSmoothingEnabled = (enabled == 1) }, diff --git a/game.scm b/game.scm index 79867b1..7491bd2 100644 --- a/game.scm +++ b/game.scm @@ -317,6 +317,15 @@ (hashtable-set! cache x str) str))))) +(define (draw-rotated-tile id pos angle) + (let ((hw (* tile-width 0.5)) + (hh (* tile-height 0.5))) + (save! context) + (translate! context (+ (vec2-x pos) hw) (+ (vec2-y pos) hh)) + (rotate! context angle) + (draw-tile context tileset id (- hw) (- hh)) + (restore! context))) + (define (draw-player pos alive?) (draw-tile context tileset (if alive? 0 20) (vec2-x pos) (vec2-y pos))) @@ -368,7 +377,11 @@ (let ((x (vec2-x pos)) (y (vec2-y pos))) (draw-tile context tileset 2 x y) - (draw-tile context tileset id x y) + (match direction + ('right (draw-tile context tileset id x y)) + ('left (draw-rotated-tile id pos pi)) + ('up (draw-rotated-tile id pos (* pi 1.5))) + ('down (draw-rotated-tile id pos (* pi 0.5)))) (draw-wire-state pos state))) (define (draw-electric-switch pos on?) diff --git a/modules/dom/canvas.scm b/modules/dom/canvas.scm index 1ed2774..15d5283 100644 --- a/modules/dom/canvas.scm +++ b/modules/dom/canvas.scm @@ -31,8 +31,11 @@ fill-rect fill-text draw-image + restore! + save! scale! translate! + rotate! set-transform! set-image-smoothing-enabled!)) @@ -66,12 +69,21 @@ (define-foreign draw-image "canvas" "drawImage" (ref extern) (ref extern) f64 f64 f64 f64 f64 f64 f64 f64 -> none) +(define-foreign restore! + "canvas" "restore" + (ref extern) -> none) +(define-foreign save! + "canvas" "save" + (ref extern) -> none) (define-foreign scale! "canvas" "scale" (ref extern) f64 f64 -> none) (define-foreign translate! "canvas" "translate" (ref extern) f64 f64 -> none) +(define-foreign rotate! + "canvas" "rotate" + (ref extern) f64 -> none) (define-foreign set-transform! "canvas" "setTransform" (ref extern) f64 f64 f64 f64 f64 f64 -> none) diff --git a/modules/game/levels/level-4.tmx b/modules/game/levels/level-4.tmx index afd0292..a8e10c9 100644 --- a/modules/game/levels/level-4.tmx +++ b/modules/game/levels/level-4.tmx @@ -1,5 +1,5 @@ - + diff --git a/modules/math.scm b/modules/math.scm index d1f6529..e3462ca 100644 --- a/modules/math.scm +++ b/modules/math.scm @@ -19,15 +19,15 @@ ;;; Code: (define-module (math) - #:pure - #:use-module (scheme base) #:use-module (hoot ffi) - #:export (random clamp)) + #:export (random pi clamp)) (define-foreign random "math" "random" -> f64) +(define pi (* 4.0 (atan 1.0))) + (define (clamp x min max) (cond ((< x min) min) ((> x max) max)