diff --git a/examples/platformer/game.rkt b/examples/platformer/game.rkt index 2fe3d69..9e7d845 100644 --- a/examples/platformer/game.rkt +++ b/examples/platformer/game.rkt @@ -5,6 +5,7 @@ "./periodic_timer.rkt") (require prospect/drivers/timer) +(require plot/utils) ;; for vector utilities #| @@ -73,8 +74,6 @@ where sprite-renderer produces a pict, given a frame number A ScrollOffset is a (scroll-offset Vec), indicating the vector to *subtract* from world coordinates to get device coordinates. -A ScreenSize is a (screen-size Vec), indicating the size of the device. - The coordinate systems: World coordinates = the large virtual canvas, origin at top-left, x increases right and y increases down @@ -279,7 +278,7 @@ Player -> Physics: (jump) |# ;;--------------------------------------------------------------------------- -;; +;; Keyboard and Display ;; A KeyStateChangeEvent is either ;; - (key-press KeyEvent) ;; from 2htdp @@ -288,6 +287,36 @@ Player -> Physics: (jump) (struct key-press (key) #:prefab) (struct key-release (key) #:prefab) +;; A ScreenSize is a (screen-size Vec), indicating the size of the device. +(struct screen-size (vec) #:prefab) + +;; The canvas here both delivers keyboard events and serves as a +;; display medium. +(define game-canvas% + (class canvas% + (init-field key-handler) + (super-new) + (define/override (on-char event) + (match (send event get-key-code) + ['release (key-handler (key-release (send event get-key-release-code)))] + [other (key-handler (key-press other))])))) + +;; Construct, show and return a game-canvas%. +;; Keypresses will result in ground-messages. +(define (make-frame width height) + (parameterize ((current-eventspace (make-eventspace))) + (define frame (new frame% + [label "Prospect Platformer"] + [width width] + [height height])) + (define canvas + (new game-canvas% + [parent frame] + [key-handler send-ground-message])) + (send canvas focus) + (send frame show #t) + canvas)) + ;; -> KeyboardIntegrator (define (spawn-keyboard-driver) (spawn (lambda (e s) @@ -296,6 +325,19 @@ Player -> Physics: (jump) (sub ( )) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (spawn-timer-driver) (spawn-keyboard-driver) -;;(spawn-display-driver) \ No newline at end of file +;;(spawn-display-driver) + +(let ((canvas (make-frame 600 400))) + ;; Retrieve the actual displayed size of the canvas, which differs + ;; from the requested frame size because of window chrome etc. + (define the-screen-size + (let-values (((x-max y-max) (send canvas get-client-size))) + (screen-size (vector x-max y-max)))) + (define the-dc (send canvas get-dc)) + ;; + ;; So equipped, we may spawn the renderer. + (spawn-renderer the-screen-size the-dc))