More work

This commit is contained in:
Tony Garnock-Jones 2015-10-22 17:59:31 -04:00
parent 83e36ed9e5
commit b3f8506bf7
1 changed files with 46 additions and 4 deletions

View File

@ -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)
;;(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))