Add logic gate animations.

This commit is contained in:
David Thompson 2024-05-26 15:36:39 -04:00
parent d24124e57e
commit 9027df5f20

View file

@ -388,6 +388,21 @@
(56 .25)
(76 .25)
(96 .25))
(define-animation anim:and-gate
(42 .4)
(115 .4)
(135 .4)
(155 .4))
(define-animation anim:or-gate
(43 .4)
(116 .4)
(136 .4)
(156 .4))
(define-animation anim:xor-gate
(44 .4)
(117 .4)
(137 .4)
(157 .4))
(define number->string*
(let ((cache (make-eq-hashtable))) ; assuming fixnums only
@ -397,13 +412,13 @@
(hashtable-set! cache x str)
str)))))
(define (draw-rotated-tile id pos angle)
(define (draw-rotated-animation anim 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))
(draw-animation context anim (- hw) (- hh))
(restore! context)))
(define (draw-player pos alive?)
@ -467,15 +482,15 @@
(define (draw-gate pos open?)
(draw-tile context tileset (if open? 46 45) (vec2-x pos) (vec2-y pos)))
(define (draw-logic-gate pos direction state id)
(define (draw-logic-gate pos direction state anim)
(let ((x (vec2-x pos))
(y (vec2-y pos)))
(draw-tile context tileset 2 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))))
('right (draw-animation context anim x y))
('left (draw-rotated-animation anim pos pi))
('up (draw-rotated-animation anim pos (* pi 1.5)))
('down (draw-rotated-animation anim pos (* pi 0.5))))
(draw-wire-state pos state)))
(define (draw-electric-switch pos on?)
@ -500,9 +515,9 @@
(('gem pos) (draw-gem pos))
(('ghost-gem pos) (draw-ghost-gem pos))
(('gate pos open?) (draw-gate pos open?))
(('and-gate pos direction state) (draw-logic-gate pos direction state 42))
(('or-gate pos direction state) (draw-logic-gate pos direction state 43))
(('xor-gate pos direction state) (draw-logic-gate pos direction state 44))
(('and-gate pos direction state) (draw-logic-gate pos direction state anim:and-gate))
(('or-gate pos direction state) (draw-logic-gate pos direction state anim:or-gate))
(('xor-gate pos direction state) (draw-logic-gate pos direction state anim:xor-gate))
(('electric-switch pos on?) (draw-electric-switch pos on?))
(('electron-warp pos state) (draw-electron-warp pos state))))
@ -623,7 +638,10 @@
(update-animation anim:electron-head dt)
(update-animation anim:electron-tail dt)
(update-animation anim:gem dt)
(update-animation anim:ghost-gem dt))
(update-animation anim:ghost-gem dt)
(update-animation anim:and-gate dt)
(update-animation anim:or-gate dt)
(update-animation anim:xor-gate dt))
(clear-rect context 0.0 0.0 *canvas-width* *canvas-height*)
(set-transform! context 1.0 0.0 0.0 1.0 0.0 0.0)
(scale! context *canvas-scale* *canvas-scale*)