Add smooth sub-tile interpolation for Pac-Man and ghosts
Entities now move smoothly between tiles instead of snapping. Previous positions are tracked in pacman and ghost ADTs; the draw layer linearly interpolates between prev and current based on movement timer progress. Residual time is carried across movement ticks for consistent speed at varying frame rates. Teleportation and ghost house exits call sync-prev! to prevent cross-map interpolation artifacts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,9 @@
|
||||
(scatter-target (make-position scatter-row scatter-col))
|
||||
(house-timer exit-delay)
|
||||
(movement-timer 0)
|
||||
(reverse-queued? #f))
|
||||
(reverse-queued? #f)
|
||||
(prev-row start-row)
|
||||
(prev-col start-col))
|
||||
|
||||
;; direction! :: symbol -> /
|
||||
(define (direction! new-dir)
|
||||
@@ -44,10 +46,20 @@
|
||||
(set! mode new-mode))
|
||||
|
||||
;; move! :: number, number -> /
|
||||
;; Saves previous position, then moves by delta.
|
||||
(define (move! delta-row delta-col)
|
||||
(set! prev-row (position 'row))
|
||||
(set! prev-col (position 'col))
|
||||
((position 'row!) (+ (position 'row) delta-row))
|
||||
((position 'col!) (+ (position 'col) delta-col)))
|
||||
|
||||
;; sync-prev! :: -> /
|
||||
;; Sets previous position to current. Call after teleportation
|
||||
;; or ghost house exit to prevent long-range interpolation.
|
||||
(define (sync-prev!)
|
||||
(set! prev-row (position 'row))
|
||||
(set! prev-col (position 'col)))
|
||||
|
||||
;; consume-reverse! :: -> boolean
|
||||
;; Returns #t and clears the flag if a reverse was queued.
|
||||
(define (consume-reverse!)
|
||||
@@ -67,6 +79,10 @@
|
||||
(define (reset-movement-timer!)
|
||||
(set! movement-timer 0))
|
||||
|
||||
;; set-movement-timer! :: number -> /
|
||||
(define (set-movement-timer! val)
|
||||
(set! movement-timer val))
|
||||
|
||||
;; advance-movement-timer! :: number -> number
|
||||
;; Returns updated movement timer value.
|
||||
(define (advance-movement-timer! delta-time)
|
||||
@@ -82,6 +98,9 @@
|
||||
((eq? msg 'mode) mode)
|
||||
((eq? msg 'mode!) mode!)
|
||||
((eq? msg 'move!) move!)
|
||||
((eq? msg 'prev-row) prev-row)
|
||||
((eq? msg 'prev-col) prev-col)
|
||||
((eq? msg 'sync-prev!) sync-prev!)
|
||||
((eq? msg 'scatter-target) scatter-target)
|
||||
((eq? msg 'in-house?) (eq? mode 'in-house))
|
||||
((eq? msg 'consume-reverse!) consume-reverse!)
|
||||
@@ -89,6 +108,7 @@
|
||||
((eq? msg 'movement-timer) movement-timer)
|
||||
((eq? msg 'advance-movement-timer!) advance-movement-timer!)
|
||||
((eq? msg 'reset-movement-timer!) reset-movement-timer!)
|
||||
((eq? msg 'set-movement-timer!) set-movement-timer!)
|
||||
(else (error "Ghost ADT -- Unknown message:" msg))))
|
||||
|
||||
dispatch-ghost))))
|
||||
|
||||
Reference in New Issue
Block a user