summaryrefslogtreecommitdiff
path: root/2d/game.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2013-12-01 22:30:37 -0500
committerDavid Thompson <dthompson2@worcester.edu>2013-12-01 22:30:37 -0500
commit8f3718977046ce73e0174b0fa550f91a18106e0d (patch)
treebd65ba472baff5734d4e689d81ffaa7b4fc97468 /2d/game.scm
parent936dcbf5179177d38514c3afb5dc185a808db80d (diff)
Move event handlers and signals into their own modules.
* 2d/game.scm (register-event-handler): New procedure. (mouse-*, key-*, window-*): Remove signals. * 2d/window.scm (window-size): New signal. * 2d/mouse.scm: New module. * 2d/keyboard.scm: New module.
Diffstat (limited to '2d/game.scm')
-rw-r--r--2d/game.scm79
1 files changed, 9 insertions, 70 deletions
diff --git a/2d/game.scm b/2d/game.scm
index e6c0161..f1b5f79 100644
--- a/2d/game.scm
+++ b/2d/game.scm
@@ -40,14 +40,7 @@
resume-game
game-running?
game-paused?
- window-size
- key-last-pressed
- key-down?
- key-directions
- key-arrows
- key-wasd
- mouse-position
- mouse-down?
+ register-event-handler
current-fps))
;;;
@@ -171,71 +164,17 @@ time in milliseconds that has passed since the last game update."
(while (SDL:poll-event e)
(handle-event e)))))
-;; Keyboard and mouse signals.
-(define window-size (make-signal #:init (vector2 0 0)))
-(define key-last-pressed (make-signal))
-(define mouse-position (make-signal #:init (vector2 0 0)))
-(define key-signals (make-hash-table))
-(define mouse-signals (make-hash-table))
+(define event-handlers '())
-(define (signal-hash-ref hash key)
- (let ((signal (hashq-ref hash key)))
- (if (signal? signal)
- signal
- (let ((signal (make-signal)))
- (hashq-set! hash key signal)
- signal))))
-
-(define (signal-hash-set! hash key value)
- (signal-set! (signal-hash-ref hash key) value))
-
-(define (key-down? key)
- "Return a signal for KEY."
- (signal-hash-ref key-signals key))
-
-(define (mouse-down? button)
- "Return a signal for BUTTON."
- (signal-hash-ref mouse-signals button))
-
-(define (key-directions up down left right)
- (signal-lift4 (lambda (up? down? left? right?)
- (let ((up (if up? -1 0))
- (down (if down? 1 0))
- (left (if left? -1 0))
- (right (if right? 1 0)))
- (vector2 (+ left right) (+ up down))))
- (key-down? up)
- (key-down? down)
- (key-down? left)
- (key-down? right)))
-
-(define key-arrows (key-directions 'up 'down 'left 'right))
-(define key-wasd (key-directions 'w 's 'a 'd))
+(define (register-event-handler event callback)
+ "Register CALLBACK to respond to events of type EVENT."
+ (set! event-handlers (acons event callback event-handlers)))
(define (handle-event e)
- "Call the relevant callbacks for the event E."
- (case (SDL:event:type e)
- ((active)
- #f)
- ((video-resize)
- (signal-set! window-size (vector2 (SDL:event:resize:w e)
- (SDL:event:resize:h e))))
- ((quit)
- (quit-game))
- ((key-down)
- (let ((key (SDL:event:key:keysym:sym e)))
- (signal-hash-set! key-signals key #t)
- (signal-set! key-last-pressed key)))
- ((key-up)
- (signal-hash-set! key-signals (SDL:event:key:keysym:sym e) #f))
- ((mouse-motion)
- (signal-set! mouse-position
- (vector2 (SDL:event:motion:x e)
- (SDL:event:motion:y e))))
- ((mouse-button-down)
- (signal-hash-set! mouse-signals (SDL:event:button:button e) #t))
- ((mouse-button-up)
- (signal-hash-set! mouse-signals (SDL:event:button:button e) #f))))
+ "Call the relevant callback procedure for the event E."
+ (let ((handler (assq-ref event-handlers (SDL:event:type e))))
+ (when handler
+ (handler e))))
;;;
;;; Frames Per Second