lux/examples/spin.rkt

61 lines
1.9 KiB
Racket

#lang racket/base
(require racket/match
racket/fixnum
racket/draw
racket/class
lux
lux/chaos/gui
lux/chaos/gui/key
lux/chaos/gui/mouse)
(define COLORS
'("red" "orange" "yellow" "green" "blue" "indigo" "violet"))
(struct spin (layer ks ms color frame)
#:methods gen:word
[(define (word-label s ft)
(lux-standard-label "Spin!" ft))
(define (word-tick w es)
(match-define (spin layer ks ms color f) w)
(define closed? #f)
(for ([e es])
(match e
['close
(set! closed? #t)]
[(? mouse-event? me)
(mouse-state-update! ms me)]
[(? key-event? ke)
(key-state-update! ks ke)]))
(define x (mouse-state-x ms))
(define y (mouse-state-y ms))
(when (key-state-set?! ks #\space)
(set! color (fxmodulo (fx+ 1 color) (length COLORS))))
(when (key-state-set?! ks #\return)
(spin-it! (add1 layer)))
(match (or closed?
(key-state-set?! ks 'escape))
[#t
(values #f w)]
[#f
(values (spin layer ks ms color (fxmodulo (fx+ f 1) 360))
(lambda (width height dc)
(send dc set-background (list-ref COLORS color))
(send dc clear)
(send dc set-rotation (* (/ f 360) 2 3.14))
(send dc set-origin x y)
(send dc draw-text (format "~a: Spinning!" layer) 0 0)))]))])
(define (spin-it! layer)
(define s
(spin layer
(make-key-state)
(make-mouse-state)
0 0))
(fiat-lux s))
(module+ main
(call-with-chaos
(make-gui 60.0)
(λ ()
(spin-it! 0))))