#lang r7rs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Spel ADT ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-library () (import (scheme base) (snake-wpo adt-level) (snake-wpo constanten) (snake-wpo adt-teken)) (export maak-spel) (begin ;; maak-spel :: / -> spel (define (maak-spel) ;; Dit is het eigenlijk spel object. (let ((level (maak-level spel-breedte spel-hoogte)) (teken (maak-teken venster-breedte-px venster-hoogte-px))) ;; toets-procedure :: symbol, any -> / (define (toets-procedure status toets) ;; status is ofwel gelijk aan ... ;; - 'pressed: wanneer de toets ingedrukt wordt ;; - 'released: wanneer de toets losgelaten wordt ;; Wanneer de toets voor lange tijd ingedrukt wordt, dan wordt deze ;; procedure meermaals aangeroepen waarbij status gelijk is aan 'pressed ;; voor dezelfde toets! (if (eq? status 'pressed) ((level 'toets!) toets))) ;; spel-lus-procedure :: number -> / (define (spel-lus-procedure delta-tijd) ((level 'update!) delta-tijd)) (define (teken-procedure) ((teken 'teken-spel!) dispatch-spel)) (define (start!) ;; Stel de callbacks in voor het teken ADT: implementatie van de spellus. ((teken 'set-spel-lus-functie!) spel-lus-procedure) ((teken 'set-toets-functie!) toets-procedure) ((teken 'start-tekenen!) dispatch-spel)) ;; Dispatch functie (define (dispatch-spel msg) (cond ((eq? msg 'start!) start!) ((eq? msg 'level) level) (else (error "Spel ADT -- Onbekend bericht:" msg)))) dispatch-spel))))