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))
|
||||
(paused? #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.
|
||||
(set! key (make-key maze))
|
||||
@@ -77,7 +79,8 @@
|
||||
(define (eat-coin! row col)
|
||||
((maze 'cell-set!) row col cell-type-empty)
|
||||
((score 'increase!))
|
||||
((timer 'increase!)))
|
||||
((timer 'increase!))
|
||||
(on-coins-changed!))
|
||||
|
||||
;;
|
||||
;; Key logic
|
||||
@@ -87,7 +90,8 @@
|
||||
;; Picks up the key and clears the cell.
|
||||
(define (pick-up-key! row col)
|
||||
((maze 'cell-set!) row col cell-type-empty)
|
||||
((key 'take!)))
|
||||
((key 'take!))
|
||||
(on-coins-changed!))
|
||||
|
||||
;;
|
||||
;; Teleportation logic
|
||||
@@ -130,7 +134,8 @@
|
||||
;; Door: open it if key has been taken.
|
||||
(((maze 'door?) next-row next-col)
|
||||
(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.
|
||||
(else
|
||||
@@ -201,6 +206,16 @@
|
||||
;; 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)
|
||||
(cond ((eq? msg 'maze) maze)
|
||||
((eq? msg 'pacman) pacman)
|
||||
@@ -210,6 +225,8 @@
|
||||
((eq? msg 'paused?) paused?)
|
||||
((eq? msg 'key-press!) key-press!)
|
||||
((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))))
|
||||
|
||||
dispatch-level))))
|
||||
|
||||
Reference in New Issue
Block a user