added Doors game support ( in time for for APLAS talk )
svn: r4726
This commit is contained in:
parent
79517ed95c
commit
fb8ccb8f05
9
collects/games/doors/doc.txt
Normal file
9
collects/games/doors/doc.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
_doors.ss_
|
||||||
|
|
||||||
|
The "doors.ss" library builds on "gl-board.ss" to support simple
|
||||||
|
maze-like games, where the maze is formed by a grid of squares and
|
||||||
|
doors of various types can appears between adjacent squares.
|
||||||
|
|
||||||
|
But it's not ready, yet. Check back later.
|
||||||
|
|
237
collects/games/doors/doors.ss
Normal file
237
collects/games/doors/doors.ss
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
(module doors mzscheme
|
||||||
|
(require (lib "gl-board.ss" "games" "gl-board-game")
|
||||||
|
(lib "gl-vectors.ss" "sgl")
|
||||||
|
(prefix gl- (lib "sgl.ss" "sgl"))
|
||||||
|
(lib "bitmap.ss" "sgl")
|
||||||
|
(lib "mred.ss" "mred")
|
||||||
|
(lib "list.ss")
|
||||||
|
(lib "etc.ss")
|
||||||
|
(lib "class.ss"))
|
||||||
|
|
||||||
|
(provide door-game%
|
||||||
|
player-data
|
||||||
|
thing-data)
|
||||||
|
|
||||||
|
(define-struct door-game (board))
|
||||||
|
|
||||||
|
(define light-blue (gl-float-vector 0.5 0.5 1.0 0.5))
|
||||||
|
(define light-red (gl-float-vector 1.0 0.5 0.5 0.5))
|
||||||
|
|
||||||
|
(define-struct room (data players things))
|
||||||
|
(define-struct wall (drawer))
|
||||||
|
(define-struct player (data drawer i j))
|
||||||
|
(define-struct thing (data drawer i j heads-up?))
|
||||||
|
|
||||||
|
(define door-game%
|
||||||
|
(class object%
|
||||||
|
(init [(canvas-parent parent)] x-rooms y-rooms
|
||||||
|
[move-callback void])
|
||||||
|
|
||||||
|
(define rooms (build-vector
|
||||||
|
x-rooms
|
||||||
|
(lambda (i)
|
||||||
|
(build-vector
|
||||||
|
y-rooms
|
||||||
|
(lambda (j)
|
||||||
|
(make-room #f null null))))))
|
||||||
|
|
||||||
|
(define walls (build-vector
|
||||||
|
(add1 (* 2 x-rooms))
|
||||||
|
(lambda (i)
|
||||||
|
(build-vector
|
||||||
|
(add1 (* 2 y-rooms))
|
||||||
|
(lambda (j)
|
||||||
|
(make-wall #f))))))
|
||||||
|
|
||||||
|
(define board
|
||||||
|
(new gl-board%
|
||||||
|
(parent canvas-parent)
|
||||||
|
(min-x -1) (max-x (add1 x-rooms))
|
||||||
|
(min-y -1) (max-y (add1 y-rooms))
|
||||||
|
(lift 0.15)
|
||||||
|
(move (lambda (piece to)
|
||||||
|
(let ((to-i (inexact->exact (floor (gl-vector-ref to 0))))
|
||||||
|
(to-j (inexact->exact (floor (gl-vector-ref to 1)))))
|
||||||
|
(when (and (< -1 to-i x-rooms)
|
||||||
|
(< -1 to-j y-rooms))
|
||||||
|
(let ([room (vector-ref (vector-ref rooms to-i) to-j)])
|
||||||
|
(move-callback (player-data piece) (room-data room) to-i to-j))))))
|
||||||
|
(phi 30)))
|
||||||
|
|
||||||
|
(define/private (make-wall-dl dir door?)
|
||||||
|
(send board with-gl-context
|
||||||
|
(lambda ()
|
||||||
|
(let ((list-id (gl-gen-lists 1)))
|
||||||
|
(gl-new-list list-id 'compile)
|
||||||
|
(let ([one-wall
|
||||||
|
(lambda (color)
|
||||||
|
(gl-material-v 'front-and-back 'ambient-and-diffuse color)
|
||||||
|
(when door?
|
||||||
|
(gl-begin 'polygon)
|
||||||
|
(gl-vertex 0.0 0.0 0.0)
|
||||||
|
(gl-vertex 0.33 0.0 0.0)
|
||||||
|
(gl-vertex 0.33 0.0 0.35)
|
||||||
|
(gl-vertex 0.0 0.0 0.35)
|
||||||
|
(gl-end)
|
||||||
|
(gl-begin 'polygon)
|
||||||
|
(gl-vertex 0.66 0.0 0.0)
|
||||||
|
(gl-vertex 1.0 0.0 0.0)
|
||||||
|
(gl-vertex 1.0 0.0 0.35)
|
||||||
|
(gl-vertex 0.66 0.0 0.35)
|
||||||
|
(gl-end))
|
||||||
|
(gl-begin 'polygon)
|
||||||
|
(gl-vertex 0.0 0.0 (if door? 0.35 0.0))
|
||||||
|
(gl-vertex 1.0 0.0 (if door? 0.35 0.0))
|
||||||
|
(gl-vertex 1.0 0.0 0.52)
|
||||||
|
(gl-vertex 0.0 0.0 0.52)
|
||||||
|
(gl-end))])
|
||||||
|
(case dir
|
||||||
|
[(s)
|
||||||
|
(one-wall light-blue)]
|
||||||
|
[(n)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate 0.0 1.0 0.0)
|
||||||
|
(one-wall light-blue)
|
||||||
|
(gl-pop-matrix)]
|
||||||
|
[(w)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-rotate 90 0 0 1)
|
||||||
|
(one-wall light-red)
|
||||||
|
(gl-pop-matrix)]
|
||||||
|
[(e)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-rotate 90 0 0 1)
|
||||||
|
(gl-translate 0.0 -1.0 0.0)
|
||||||
|
(one-wall light-red)
|
||||||
|
(gl-pop-matrix)])
|
||||||
|
(gl-end-list)
|
||||||
|
list-id)))))
|
||||||
|
|
||||||
|
(define cache (make-hash-table 'equal))
|
||||||
|
(define/private (make-wall-dl/cached dir door?)
|
||||||
|
(let ([key (list dir door?)])
|
||||||
|
(hash-table-get cache key
|
||||||
|
(lambda ()
|
||||||
|
(let ([dl (make-wall-dl dir door?)])
|
||||||
|
(hash-table-put! cache key dl)
|
||||||
|
dl)))))
|
||||||
|
|
||||||
|
(define/private (make-wall-draw dx dy dir door)
|
||||||
|
(let ([space-dl (make-wall-dl/cached dir
|
||||||
|
(and door #t))])
|
||||||
|
(lambda ()
|
||||||
|
(gl-enable 'blend)
|
||||||
|
(gl-blend-func 'src-alpha 'one-minus-src-alpha)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate dx dy 0.0)
|
||||||
|
(gl-call-list space-dl)
|
||||||
|
(gl-pop-matrix)
|
||||||
|
(gl-blend-func 'one 'one)
|
||||||
|
(gl-disable 'blend)
|
||||||
|
(when door
|
||||||
|
(let ([a-door
|
||||||
|
(lambda (ddx ddy rot)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate dx dy 0.0)
|
||||||
|
(gl-translate ddx ddy 0.0)
|
||||||
|
(gl-rotate rot 0 0 1)
|
||||||
|
(gl-translate 0.33 0.0 0.35)
|
||||||
|
(gl-scale 0.33 1 0.35)
|
||||||
|
(gl-rotate -90 1 0 0)
|
||||||
|
(door)
|
||||||
|
(gl-pop-matrix))])
|
||||||
|
(case dir
|
||||||
|
[(s) (a-door 0 0 0)]
|
||||||
|
[(e) (a-door 1.0 0 90)]
|
||||||
|
[(n) (a-door 0 1.0 0)]
|
||||||
|
[(w) (a-door 0 0 90)]))))))
|
||||||
|
|
||||||
|
;; Switch lighting to ambient
|
||||||
|
(send board with-gl-context
|
||||||
|
(lambda ()
|
||||||
|
(gl-disable 'light0)
|
||||||
|
(gl-light-model-v 'light-model-ambient (gl-float-vector 1.0 1.0 1.0 0.0))))
|
||||||
|
|
||||||
|
(define/public (with-gl-context f)
|
||||||
|
(send board with-gl-context f))
|
||||||
|
|
||||||
|
(define/public (set-wall ri rj dir wall? door)
|
||||||
|
(case dir
|
||||||
|
[(n s e w) 'ok]
|
||||||
|
[else (raise-type-error
|
||||||
|
'set-wall
|
||||||
|
"'n, 's, 'e, or 'w"
|
||||||
|
dir)])
|
||||||
|
(let* ([i (+ (* 2 ri) (case dir
|
||||||
|
[(w) 0]
|
||||||
|
[(n s) 1]
|
||||||
|
[(e) 2]))]
|
||||||
|
[j (+ (* 2 rj) (case dir
|
||||||
|
[(n) 2]
|
||||||
|
[(w e) 1]
|
||||||
|
[(s) 0]))]
|
||||||
|
[wall (vector-ref (vector-ref walls i) j)]
|
||||||
|
[drawer (if wall?
|
||||||
|
(make-wall-draw ri rj dir door)
|
||||||
|
void)])
|
||||||
|
(if (wall-drawer wall)
|
||||||
|
(send board set-space-draw wall drawer)
|
||||||
|
(send board add-space drawer wall))
|
||||||
|
(set-wall-drawer! wall drawer))
|
||||||
|
(send board refresh))
|
||||||
|
|
||||||
|
(define/public (set-room i j data)
|
||||||
|
(let ([room (vector-ref (vector-ref rooms i) j)])
|
||||||
|
(set-room-data! room data)))
|
||||||
|
|
||||||
|
(public [new-player make-player])
|
||||||
|
(define (new-player drawer data)
|
||||||
|
(make-player data drawer #f #f))
|
||||||
|
|
||||||
|
(define/public (move-player player i j)
|
||||||
|
(let ([from-room (and (player-i player)
|
||||||
|
(vector-ref (vector-ref rooms (player-i player)) (player-j player)))]
|
||||||
|
[to-room (and i (vector-ref (vector-ref rooms i) j))])
|
||||||
|
(when from-room
|
||||||
|
(set-room-players! from-room (remq player (room-players from-room))))
|
||||||
|
(when to-room
|
||||||
|
(set-room-players! to-room (cons player (room-players to-room))))
|
||||||
|
(set-player-i! player i)
|
||||||
|
(set-player-j! player j)
|
||||||
|
(when from-room
|
||||||
|
(send board remove-piece player))
|
||||||
|
(when to-room
|
||||||
|
(send board add-piece (+ i 0.5) (+ j 0.5) 0.0 (player-drawer player) player))))
|
||||||
|
|
||||||
|
(public [new-thing make-thing])
|
||||||
|
(define (new-thing drawer data)
|
||||||
|
(make-thing data drawer #f #f #f))
|
||||||
|
|
||||||
|
(define/private (move-thing/hu thing i j hu?)
|
||||||
|
(let ([from-hu? (thing-heads-up? thing)]
|
||||||
|
[from-room (and (thing-i thing)
|
||||||
|
(vector-ref (vector-ref rooms (thing-i thing)) (thing-j thing)))]
|
||||||
|
[to-room (and i (vector-ref (vector-ref rooms i) j))])
|
||||||
|
(when from-room
|
||||||
|
(set-room-things! from-room (remq thing (room-things from-room))))
|
||||||
|
(when to-room
|
||||||
|
(set-room-things! to-room (cons thing (room-things to-room))))
|
||||||
|
(set-thing-i! thing i)
|
||||||
|
(set-thing-j! thing j)
|
||||||
|
(set-thing-heads-up?! thing hu?)
|
||||||
|
(when from-room
|
||||||
|
(send board remove-piece thing))
|
||||||
|
(when from-hu?
|
||||||
|
(send board remove-heads-up thing))
|
||||||
|
(when to-room
|
||||||
|
(send board add-piece (+ i 0.5) (+ j 0.5) 0.0 (thing-drawer thing) thing)
|
||||||
|
(send board enable-piece thing #f))
|
||||||
|
(when hu?
|
||||||
|
(send board add-heads-up 1.0 1.0 (thing-drawer thing) thing))))
|
||||||
|
|
||||||
|
(define/public (move-thing thing i j)
|
||||||
|
(move-thing/hu thing i j #f))
|
||||||
|
(define/public (move-thing-heads-up thing)
|
||||||
|
(move-thing/hu thing #f #f #t))
|
||||||
|
|
||||||
|
(super-new))))
|
3
collects/games/doors/info.ss
Normal file
3
collects/games/doors/info.ss
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
(module info (lib "infotab.ss" "setup")
|
||||||
|
(define name "Doors game library")
|
||||||
|
(define doc.txt "doc.txt"))
|
105
collects/games/doors/maze.ss
Normal file
105
collects/games/doors/maze.ss
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
|
||||||
|
(module maze mzscheme
|
||||||
|
(require (lib "class.ss")
|
||||||
|
"private/utils.ss")
|
||||||
|
(require-for-syntax "private/utils.ss")
|
||||||
|
|
||||||
|
(provide maze)
|
||||||
|
|
||||||
|
(define (check <%> v)
|
||||||
|
(unless (v . is-a? . <%>)
|
||||||
|
(error 'maze
|
||||||
|
"not an instance of ~a: ~e"
|
||||||
|
<%>
|
||||||
|
v))
|
||||||
|
v)
|
||||||
|
|
||||||
|
(define (connect-all! connect-key layout)
|
||||||
|
(define-member-name connect connect-key)
|
||||||
|
(let loop ([layout layout]
|
||||||
|
[j (sub1 (quotient (length layout) 2))])
|
||||||
|
(unless (null? (cdr layout))
|
||||||
|
(let loop ([doors (car layout)]
|
||||||
|
[rooms (cadr layout)]
|
||||||
|
[next-doors (caddr layout)]
|
||||||
|
[i 0])
|
||||||
|
(unless (null? (cdr rooms))
|
||||||
|
(let ([n (car doors)]
|
||||||
|
[s (car next-doors)]
|
||||||
|
[e (caddr rooms)]
|
||||||
|
[w (car rooms)]
|
||||||
|
[r (cadr rooms)])
|
||||||
|
(send r connect i j n s e w))
|
||||||
|
(loop (cdr doors)
|
||||||
|
(cddr rooms)
|
||||||
|
(cdr next-doors)
|
||||||
|
(add1 i))))
|
||||||
|
(loop (cddr layout) (sub1 j)))))
|
||||||
|
|
||||||
|
(define-syntax maze
|
||||||
|
(lambda (stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(maze connect door<%> room<%> (items ...) ...)
|
||||||
|
(let ([itemss (syntax->list #'((items ...) ...))])
|
||||||
|
(unless (odd? (length itemss))
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"need an odd number of rows"
|
||||||
|
stx))
|
||||||
|
(let-values ([(doorss roomss) (alternates itemss)])
|
||||||
|
(when (null? roomss)
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"no rooms supplied"
|
||||||
|
stx))
|
||||||
|
(let ([first-doors-len
|
||||||
|
(length (syntax->list (car doorss)))])
|
||||||
|
(for-each (lambda (doors)
|
||||||
|
(let ([len (length (syntax->list doors))])
|
||||||
|
(unless (= len first-doors-len)
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"N/S doors sequence length doesn't match first doors sequence"
|
||||||
|
stx
|
||||||
|
doors))))
|
||||||
|
doorss)
|
||||||
|
(for-each (lambda (rooms)
|
||||||
|
(let ([len (length (syntax->list rooms))])
|
||||||
|
(unless (= len (add1 (* 2 first-doors-len)))
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"rooms with E/W doors sequence length doesn't match first doors sequence"
|
||||||
|
stx
|
||||||
|
rooms))))
|
||||||
|
roomss))
|
||||||
|
(with-syntax ([((items ...) ...)
|
||||||
|
(interleave
|
||||||
|
(map (lambda (doors)
|
||||||
|
(map (lambda (door)
|
||||||
|
(quasisyntax/loc door
|
||||||
|
(instance door<%> #,door)))
|
||||||
|
(syntax->list doors)))
|
||||||
|
doorss)
|
||||||
|
(map (lambda (rooms)
|
||||||
|
(let-values ([(doors rooms)
|
||||||
|
(alternates (syntax->list rooms))])
|
||||||
|
(interleave
|
||||||
|
(map (lambda (door)
|
||||||
|
(quasisyntax/loc door
|
||||||
|
(instance door<%> #,door)))
|
||||||
|
doors)
|
||||||
|
(map (lambda (room)
|
||||||
|
(quasisyntax/loc room
|
||||||
|
(instance room<%> #,room)))
|
||||||
|
rooms))))
|
||||||
|
roomss))])
|
||||||
|
(syntax/loc stx
|
||||||
|
(connect-all! (member-name-key connect) (list (list items ...) ...))))))])))
|
||||||
|
|
||||||
|
(define-syntax instance
|
||||||
|
(syntax-rules (unquote)
|
||||||
|
[(instance <%> (unquote v))
|
||||||
|
(check <%> v)]
|
||||||
|
[(instance <%> %)
|
||||||
|
(check <%> (new %))])))
|
||||||
|
|
21
collects/games/doors/private/utils.ss
Normal file
21
collects/games/doors/private/utils.ss
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
(module utils mzscheme
|
||||||
|
(provide alternates
|
||||||
|
interleave)
|
||||||
|
|
||||||
|
(define (alternates l)
|
||||||
|
(let loop ([l l])
|
||||||
|
(cond
|
||||||
|
[(null? l) (values null null)]
|
||||||
|
[(null? (cdr l)) (values l null)]
|
||||||
|
[else
|
||||||
|
(let-values ([(as bs) (loop (cddr l))])
|
||||||
|
(values (cons (car l) as)
|
||||||
|
(cons (cadr l) bs)))])))
|
||||||
|
|
||||||
|
(define (interleave l1 l2)
|
||||||
|
(cond
|
||||||
|
[(null? l2) l1]
|
||||||
|
[else (list* (car l1)
|
||||||
|
(car l2)
|
||||||
|
(interleave (cdr l1) (cdr l2)))])))
|
205
collects/games/doors/utils.ss
Normal file
205
collects/games/doors/utils.ss
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
(module utils mzscheme
|
||||||
|
(require (lib "gl-vectors.ss" "sgl")
|
||||||
|
(prefix gl- (lib "sgl.ss" "sgl"))
|
||||||
|
(lib "bitmap.ss" "sgl")
|
||||||
|
(lib "math.ss")
|
||||||
|
(lib "mred.ss" "mred")
|
||||||
|
(lib "list.ss")
|
||||||
|
(lib "etc.ss")
|
||||||
|
(lib "class.ss")
|
||||||
|
(lib "kw.ss"))
|
||||||
|
|
||||||
|
(provide bitmap->drawer
|
||||||
|
|
||||||
|
door-bm
|
||||||
|
magic-door-bm
|
||||||
|
locked-door-bm
|
||||||
|
|
||||||
|
door-drawer
|
||||||
|
locked-door-drawer
|
||||||
|
magic-door-drawer
|
||||||
|
open-door-drawer
|
||||||
|
|
||||||
|
make-i-player
|
||||||
|
make-key-thing)
|
||||||
|
|
||||||
|
(define light-black (gl-float-vector 0.0 0.0 0.0 0.25))
|
||||||
|
(define green (gl-float-vector 0.0 1.0 0.0 1.0))
|
||||||
|
(define yellow (gl-float-vector 1.0 1.0 0.0 1.0))
|
||||||
|
(define black (gl-float-vector 0.0 0.0 0.0 1.0))
|
||||||
|
(define dark-gray (gl-float-vector 0.2 0.2 0.2 1.0))
|
||||||
|
|
||||||
|
(define door-bm
|
||||||
|
(make-object bitmap%
|
||||||
|
(build-path (collection-path "games" "checkers") "light.jpg")))
|
||||||
|
|
||||||
|
(define (with-gl game)
|
||||||
|
(lambda (f)
|
||||||
|
(send game with-gl-context f)))
|
||||||
|
|
||||||
|
(define (bitmap->drawer bm game)
|
||||||
|
(let ([dl (bitmap->gl-list bm (with-gl game))])
|
||||||
|
(lambda ()
|
||||||
|
(gl-call-list dl))))
|
||||||
|
|
||||||
|
(define (door-drawer game)
|
||||||
|
(bitmap->drawer door-bm game))
|
||||||
|
|
||||||
|
(define (open-door-drawer game)
|
||||||
|
void)
|
||||||
|
|
||||||
|
(define (add-to-door draw)
|
||||||
|
(let* ([w (send door-bm get-width)]
|
||||||
|
[h (send door-bm get-height)]
|
||||||
|
[bm (make-object bitmap% w h)]
|
||||||
|
[dc (make-object bitmap-dc% bm)])
|
||||||
|
(send dc draw-bitmap door-bm 0 0)
|
||||||
|
(draw dc w h)
|
||||||
|
(send dc set-bitmap #f)
|
||||||
|
bm))
|
||||||
|
|
||||||
|
(define magic-door-bm
|
||||||
|
(add-to-door
|
||||||
|
(lambda (dc w h)
|
||||||
|
(send dc set-font (send the-font-list find-or-create-font 32 'default))
|
||||||
|
(send dc set-text-foreground (make-object color% "yellow"))
|
||||||
|
(let-values ([(sw sh sd sa) (send dc get-text-extent "\u2605")])
|
||||||
|
(send dc draw-text "\u2605" (/ (- w sw) 2) (/ (- h sh) 2))))))
|
||||||
|
|
||||||
|
(define (magic-door-drawer game)
|
||||||
|
(bitmap->drawer magic-door-bm game))
|
||||||
|
|
||||||
|
(define locked-door-bm
|
||||||
|
(add-to-door
|
||||||
|
(lambda (dc w h)
|
||||||
|
(send dc set-brush (send the-brush-list find-or-create-brush "black" 'solid))
|
||||||
|
(send dc set-pen (send the-pen-list find-or-create-pen "black" 1 'solid))
|
||||||
|
(send dc draw-ellipse (/ (- w (* 0.2 h)) 2) (* 0.2 h)
|
||||||
|
(* 0.2 h) (* 0.2 h))
|
||||||
|
(send dc draw-rectangle (* w 0.45) (* 0.3 h)
|
||||||
|
(* 0.1 w) (* 0.3 h)))))
|
||||||
|
|
||||||
|
(define (locked-door-drawer game)
|
||||||
|
(bitmap->drawer locked-door-bm game))
|
||||||
|
|
||||||
|
(define (q game)
|
||||||
|
(send game with-gl-context
|
||||||
|
(lambda ()
|
||||||
|
(let ([q (gl-new-quadric)])
|
||||||
|
(gl-quadric-draw-style q 'fill)
|
||||||
|
(gl-quadric-normals q 'smooth)
|
||||||
|
q))))
|
||||||
|
|
||||||
|
(define (sphere-dl game color)
|
||||||
|
(send game with-gl-context
|
||||||
|
(let ([q (q game)])
|
||||||
|
(lambda ()
|
||||||
|
(let ((list-id (gl-gen-lists 1)))
|
||||||
|
(gl-new-list list-id 'compile)
|
||||||
|
(gl-material-v 'front-and-back 'ambient-and-diffuse color)
|
||||||
|
(gl-sphere q 0.5 20 20)
|
||||||
|
(gl-end-list)
|
||||||
|
list-id)))))
|
||||||
|
|
||||||
|
(define (make-cylinder-dl game color disk?)
|
||||||
|
(send game with-gl-context
|
||||||
|
(lambda ()
|
||||||
|
(let ((list-id (gl-gen-lists 1))
|
||||||
|
(q (q game)))
|
||||||
|
(gl-new-list list-id 'compile)
|
||||||
|
(gl-material-v 'front-and-back 'ambient-and-diffuse color)
|
||||||
|
(gl-cylinder q 0.5 0.5 1.0 20 1)
|
||||||
|
(when disk?
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate 0 0 1.0)
|
||||||
|
(gl-disk q 0.0 0.5 25 1)
|
||||||
|
(gl-pop-matrix))
|
||||||
|
(gl-end-list)
|
||||||
|
list-id))))
|
||||||
|
|
||||||
|
(define/kw (make-i-player game
|
||||||
|
#:key
|
||||||
|
[color green]
|
||||||
|
[data #f])
|
||||||
|
(let ([shadow-cylinder-dl (make-cylinder-dl game dark-gray #t)]
|
||||||
|
[cylinder-dl (make-cylinder-dl game color #f)]
|
||||||
|
[sphere-dl (sphere-dl game color)])
|
||||||
|
(send game make-player
|
||||||
|
(lambda (just-shadow?)
|
||||||
|
(with-light
|
||||||
|
just-shadow?
|
||||||
|
(lambda ()
|
||||||
|
(unless just-shadow?
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate 0.0 0.0 0.30)
|
||||||
|
(gl-scale 0.25 0.25 0.25)
|
||||||
|
(gl-scale 0.5 0.5 0.5)
|
||||||
|
(gl-call-list sphere-dl)
|
||||||
|
(gl-pop-matrix))
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-scale 0.25 0.25 0.5)
|
||||||
|
(gl-scale 0.5 0.5 0.5)
|
||||||
|
(gl-call-list (if just-shadow?
|
||||||
|
shadow-cylinder-dl
|
||||||
|
cylinder-dl))
|
||||||
|
(gl-pop-matrix))))
|
||||||
|
data)))
|
||||||
|
|
||||||
|
(define (make-key-dl game color)
|
||||||
|
(send game with-gl-context
|
||||||
|
(lambda ()
|
||||||
|
(let ((list-id (gl-gen-lists 1))
|
||||||
|
(q (q game)))
|
||||||
|
(gl-new-list list-id 'compile)
|
||||||
|
(gl-material-v 'front-and-back 'ambient-and-diffuse color)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate -0.25 0 0)
|
||||||
|
(gl-cylinder q 0.25 0.25 0.2 20 1)
|
||||||
|
(gl-cylinder q 0.1 0.1 0.2 20 1)
|
||||||
|
(gl-disk q 0.1 0.25 20 2)
|
||||||
|
(gl-translate 0 0 0.2)
|
||||||
|
(gl-disk q 0.1 0.25 20 2)
|
||||||
|
(gl-pop-matrix)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate -0.05 0 0.1)
|
||||||
|
(gl-rotate 90 0 1 0)
|
||||||
|
(gl-cylinder q 0.1 0.1 0.5 16 1)
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-translate 0 0 0.5)
|
||||||
|
(gl-disk q 0 0.1 16 1)
|
||||||
|
(gl-pop-matrix)
|
||||||
|
(let ([tooth
|
||||||
|
(lambda ()
|
||||||
|
(gl-push-matrix)
|
||||||
|
(gl-rotate 90 1 0 0)
|
||||||
|
(gl-cylinder q 0.05 0.05 0.25 16 1)
|
||||||
|
(gl-translate 0 0 0.25)
|
||||||
|
(gl-disk q 0 0.05 16 1)
|
||||||
|
(gl-pop-matrix))])
|
||||||
|
(gl-translate 0 0 0.2)
|
||||||
|
(tooth)
|
||||||
|
(gl-translate 0 0 0.2)
|
||||||
|
(tooth))
|
||||||
|
(gl-pop-matrix)
|
||||||
|
(gl-end-list)
|
||||||
|
list-id))))
|
||||||
|
|
||||||
|
(define (with-light just-shadow? thunk)
|
||||||
|
(unless just-shadow?
|
||||||
|
(gl-enable 'light0)
|
||||||
|
(gl-light-model-v 'light-model-ambient (gl-float-vector 0.5 0.5 0.5 0.0)))
|
||||||
|
(thunk)
|
||||||
|
(unless just-shadow?
|
||||||
|
(gl-light-model-v 'light-model-ambient (gl-float-vector 1.0 1.0 1.0 0.0))
|
||||||
|
(gl-disable 'light0)))
|
||||||
|
|
||||||
|
(define/kw (make-key-thing game
|
||||||
|
#:key
|
||||||
|
[color yellow])
|
||||||
|
(let ([dl (make-key-dl game color)])
|
||||||
|
(send game make-thing
|
||||||
|
(lambda/kw (#:optional [just-shadow? #f])
|
||||||
|
(with-light just-shadow? (lambda ()
|
||||||
|
(gl-scale 0.5 0.5 0.5)
|
||||||
|
(gl-call-list dl))))
|
||||||
|
'thing))))
|
|
@ -82,7 +82,9 @@ the board. They are used to setup viewing parameters. The board is viewed
|
||||||
centered around the center of the coordinates, and the view attempts to fill
|
centered around the center of the coordinates, and the view attempts to fill
|
||||||
the window to them. The optional theta and phi arguments determine the initial
|
the window to them. The optional theta and phi arguments determine the initial
|
||||||
rotation of the board, with respective defaults 45 and 0; theta corresponds to
|
rotation of the board, with respective defaults 45 and 0; theta corresponds to
|
||||||
the up and down keys, and phi corresponds to the left and right keys.
|
the up and down keys, and phi corresponds to the left and right keys. (Holding
|
||||||
|
down Command/Meta/Alt while pressing an arrow key pans the display, instead
|
||||||
|
of rotating.)
|
||||||
|
|
||||||
The lift parameter specifies how high off the board mouse-dragged pieces are.
|
The lift parameter specifies how high off the board mouse-dragged pieces are.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
(list "cards" "paint-by-numbers" "same" "lights-out" "aces" "spider"
|
(list "cards" "paint-by-numbers" "same" "lights-out" "aces" "spider"
|
||||||
"memory" "pousse" "crazy8s"
|
"memory" "pousse" "crazy8s"
|
||||||
"gcalc" "parcheesi" "gl-board-game"
|
"gcalc" "parcheesi" "gl-board-game"
|
||||||
"jewel"))
|
"jewel" "doors"))
|
||||||
(define blurb
|
(define blurb
|
||||||
(list "Demos a few small "
|
(list "Demos a few small "
|
||||||
'(a ((MZSCHEME "
|
'(a ((MZSCHEME "
|
||||||
|
|
Loading…
Reference in New Issue
Block a user