;;; Jumping PacMan
(definePAUSE0.002) ; determines the speed
;;; MODEL
;; Coordinate system
; (xmin,ymax) ... (xmax,ymax)
; . .
; . .
; (xmin,ymin) ... (xmax,ymin)
(define-values (xminxmax) (values-11))
(define-values (yminymax) (values-11))
; At time t PacMan is at ( x(t), y(t) ).
(define (xt) (cost))
(define (yt) (sin (*3t)))
;;; CONTROL
; model-coord->screen-coord : real real -> integer integer
(define (model-coord->screen-coordxy)
; convert the model coordinates to screen coordinates
(values (floor (* (-WIDTH50) (/ (-xxmin) (-xmaxxmin))))
(floor (* (-HEIGHT50) (/ (-yymin) (-ymaxymin))))))
(define (control-loop)
(letloop ([t (*-9pi)])
(update-viewt)
(sleepPAUSE)
(loop (+t.002))))
; VIEW
; The model is shown in a WIDTH x HEIGHT frame
; Dimensions
(define-values (WIDTHHEIGHT) (values600600))
; Instantiate frame and show it
(defineframe (instantiateframe%
("Jumping PacMan")))
(sendframeshow#t)
; Put a canvas inside the frame
(definemy-canvas%
(classcanvas%
(inheritget-dc)
(define/override (on-paint)
(control-loop))
(super-instantiate ())))
(definecanvas (instantiatemy-canvas% (frame)
(min-widthWIDTH)
(min-heightHEIGHT)))
; Make a PacMan bitmap by loading a gif file
(definepacman
(make-objectbitmap%"pacman2.gif"'gif))
; Update the view by drawing PacMan on his new position.
; Due to the white border around PacMan, we don't need
; to delete the old one, before drawing him again.
(define (update-viewt)
(let ([drawing-context (sendcanvasget-dc)])
(let-values ([(sxsy) (model-coord->screen-coord (xt) (yt))])
(senddrawing-contextdraw-bitmappacmansxsy'solid))))