Optimize(Level): Add change notification callbacks for draw invalidation
Level now fires callbacks when game state changes that require redrawing: - on-coins-changed!: fired when a coin is eaten or key is picked up - on-maze-changed!: fired when a door is removed Exposes set-on-coins-changed! and set-on-maze-changed! messages so the game ADT can wire these to the draw ADT's dirty flags. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -33,7 +33,9 @@
|
|||||||
(timer (make-timer))
|
(timer (make-timer))
|
||||||
(paused? #f)
|
(paused? #f)
|
||||||
(queued-direction #f)
|
(queued-direction #f)
|
||||||
(movement-timer 0))
|
(movement-timer 0)
|
||||||
|
(on-coins-changed! (lambda () #f))
|
||||||
|
(on-maze-changed! (lambda () #f)))
|
||||||
|
|
||||||
;; Initialize key after maze is created.
|
;; Initialize key after maze is created.
|
||||||
(set! key (make-key maze))
|
(set! key (make-key maze))
|
||||||
@@ -77,7 +79,8 @@
|
|||||||
(define (eat-coin! row col)
|
(define (eat-coin! row col)
|
||||||
((maze 'cell-set!) row col cell-type-empty)
|
((maze 'cell-set!) row col cell-type-empty)
|
||||||
((score 'increase!))
|
((score 'increase!))
|
||||||
((timer 'increase!)))
|
((timer 'increase!))
|
||||||
|
(on-coins-changed!))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;; Key logic
|
;; Key logic
|
||||||
@@ -87,7 +90,8 @@
|
|||||||
;; Picks up the key and clears the cell.
|
;; Picks up the key and clears the cell.
|
||||||
(define (pick-up-key! row col)
|
(define (pick-up-key! row col)
|
||||||
((maze 'cell-set!) row col cell-type-empty)
|
((maze 'cell-set!) row col cell-type-empty)
|
||||||
((key 'take!)))
|
((key 'take!))
|
||||||
|
(on-coins-changed!))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
;; Teleportation logic
|
;; Teleportation logic
|
||||||
@@ -130,7 +134,8 @@
|
|||||||
;; Door: open it if key has been taken.
|
;; Door: open it if key has been taken.
|
||||||
(((maze 'door?) next-row next-col)
|
(((maze 'door?) next-row next-col)
|
||||||
(when (key 'taken?)
|
(when (key 'taken?)
|
||||||
((maze 'remove-door!) next-row next-col)))
|
((maze 'remove-door!) next-row next-col)
|
||||||
|
(on-maze-changed!)))
|
||||||
|
|
||||||
;; Normal movement: only if not a wall.
|
;; Normal movement: only if not a wall.
|
||||||
(else
|
(else
|
||||||
@@ -201,6 +206,16 @@
|
|||||||
;; Dispatch
|
;; Dispatch
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
;; set-on-coins-changed! :: (-> /) -> /
|
||||||
|
;; Registers a callback for when coins change (eaten or key picked up).
|
||||||
|
(define (set-on-coins-changed! callback)
|
||||||
|
(set! on-coins-changed! callback))
|
||||||
|
|
||||||
|
;; set-on-maze-changed! :: (-> /) -> /
|
||||||
|
;; Registers a callback for when the maze changes (door removed).
|
||||||
|
(define (set-on-maze-changed! callback)
|
||||||
|
(set! on-maze-changed! callback))
|
||||||
|
|
||||||
(define (dispatch-level msg)
|
(define (dispatch-level msg)
|
||||||
(cond ((eq? msg 'maze) maze)
|
(cond ((eq? msg 'maze) maze)
|
||||||
((eq? msg 'pacman) pacman)
|
((eq? msg 'pacman) pacman)
|
||||||
@@ -210,6 +225,8 @@
|
|||||||
((eq? msg 'paused?) paused?)
|
((eq? msg 'paused?) paused?)
|
||||||
((eq? msg 'key-press!) key-press!)
|
((eq? msg 'key-press!) key-press!)
|
||||||
((eq? msg 'update!) update!)
|
((eq? msg 'update!) update!)
|
||||||
|
((eq? msg 'set-on-coins-changed!) set-on-coins-changed!)
|
||||||
|
((eq? msg 'set-on-maze-changed!) set-on-maze-changed!)
|
||||||
(else (error "Level ADT -- Unknown message:" msg))))
|
(else (error "Level ADT -- Unknown message:" msg))))
|
||||||
|
|
||||||
dispatch-level))))
|
dispatch-level))))
|
||||||
|
|||||||
Reference in New Issue
Block a user