#lang r7rs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Game ADT ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Top-level game object that connects the level (logic) with the draw ADT ;; (graphics). Registers callbacks for the game loop, keys, and drawing. (define-library (pacman-project adt game) (import (scheme base) (pacman-project constants) (pacman-project adt level) (pacman-project adt draw)) (export make-game) (begin ;; make-game :: -> game (define (make-game) (let ((level (make-level)) (draw (make-draw window-width-px window-height-px))) ;; key-handler :: symbol, any -> / ;; Processes key presses and forwards them to the level. (define (key-handler status key) (when (eq? status 'pressed) ((level 'key-press!) key))) ;; game-loop :: number -> / ;; Called each frame for game state updates and animation. (define (game-loop delta-time) ((level 'update!) delta-time) ((draw 'animate-pacman!) delta-time)) ;; start! :: -> / ;; Starts the game by registering all callbacks and change listeners. (define (start!) ;; Wire level change events to draw dirty flags. ((level 'set-on-coins-changed!) (draw 'mark-coins-dirty!)) ((level 'set-on-maze-changed!) (draw 'mark-maze-dirty!)) ;; Register graphics callbacks. ((draw 'set-game-loop!) game-loop) ((draw 'set-key-callback!) key-handler) ((draw 'start-drawing!) dispatch-game)) ;; dispatch-game :: symbol -> any (define (dispatch-game msg) (cond ((eq? msg 'start!) start!) ((eq? msg 'level) level) (else (error "Game ADT -- Unknown message:" msg)))) dispatch-game))))