Easing in and out of center using a sin function
This commit is contained in:
parent
f67eb80910
commit
0b39ba733d
1 changed files with 92 additions and 55 deletions
107
game.scm
107
game.scm
|
@ -281,6 +281,8 @@
|
||||||
(set-level! *level-idx*)
|
(set-level! *level-idx*)
|
||||||
(media-play audio:bg-music)))))
|
(media-play audio:bg-music)))))
|
||||||
|
|
||||||
|
(define text-offset-y (* 0.75 tile-height))
|
||||||
|
|
||||||
;; Menu types
|
;; Menu types
|
||||||
|
|
||||||
(define-record-type <menu>
|
(define-record-type <menu>
|
||||||
|
@ -393,10 +395,10 @@
|
||||||
|
|
||||||
;; Credits
|
;; Credits
|
||||||
|
|
||||||
(define credits-margin 40.0) ;; pixels
|
(define credits-margin 0.0) ;; lines
|
||||||
(define credits-pace 30.0) ;; frames per line (inverse speed)
|
(define credits-pace 15.0) ;; ticks per line (inverse speed)
|
||||||
(define credits-start (+ game-height (* 0.75 tile-height)))
|
(define credits-start (+ game-height text-offset-y))
|
||||||
(define credits-end (* 0.75 tile-height))
|
(define credits-end text-offset-y)
|
||||||
|
|
||||||
(define line-height
|
(define line-height
|
||||||
(let ((lh #f))
|
(let ((lh #f))
|
||||||
|
@ -407,7 +409,7 @@
|
||||||
(set! lh
|
(set! lh
|
||||||
(* (+ (text-metrics-actual-bounding-box-ascent metrics)
|
(* (+ (text-metrics-actual-bounding-box-ascent metrics)
|
||||||
(text-metrics-actual-bounding-box-descent metrics))
|
(text-metrics-actual-bounding-box-descent metrics))
|
||||||
1.2))))
|
1.25))))
|
||||||
lh)))
|
lh)))
|
||||||
|
|
||||||
(define-record-type <credit>
|
(define-record-type <credit>
|
||||||
|
@ -421,13 +423,13 @@
|
||||||
|
|
||||||
(define* (make-credit #:key (lines 1)
|
(define* (make-credit #:key (lines 1)
|
||||||
(draw (lambda (y) #f))
|
(draw (lambda (y) #f))
|
||||||
(update (lambda (y) #f))
|
(update (lambda (t) #f))
|
||||||
(on-enter (lambda () #f))
|
(on-enter (lambda () #f))
|
||||||
(on-leave (lambda () #f)))
|
(on-leave (lambda () #f)))
|
||||||
(_make-credit lines draw update on-enter on-leave))
|
(_make-credit lines draw update on-enter on-leave))
|
||||||
|
|
||||||
(define* (make-credit-group #:rest credits)
|
(define* (make-credit-group #:rest credits)
|
||||||
(let ((accumulate (lambda* (accessor #:key (init 0) preproc)
|
(let ((accumulate (lambda* (accessor #:key (init 0.0) preproc)
|
||||||
(fold (lambda (c sum)
|
(fold (lambda (c sum)
|
||||||
(when preproc ((preproc c) sum))
|
(when preproc ((preproc c) sum))
|
||||||
(+ sum (accessor c)))
|
(+ sum (accessor c)))
|
||||||
|
@ -459,67 +461,102 @@
|
||||||
(make-credit-text text)
|
(make-credit-text text)
|
||||||
(make-credit-text (make-string (string-length text) #\-))))
|
(make-credit-text (make-string (string-length text) #\-))))
|
||||||
|
|
||||||
(define* (make-credit-centering credit #:key (padding 6.0) (fade 1.0))
|
(define* (make-credit-centering credit #:key (padding 6.0) (easing 4.0)
|
||||||
(let* ((offset 0.0)
|
(on-enter-center (lambda () #f))
|
||||||
(center (+ (/ (- game-height (credit-height credit)) 2)
|
(on-leave-center (lambda () #f)))
|
||||||
(* 0.75 tile-height)))
|
(let* ((pi 3.14159)
|
||||||
(beg (+ center (* (line-height) fade)))
|
(offset 0.0)
|
||||||
(end (- center (* (line-height) (+ padding (* 3 fade))))))
|
(speed (/ (line-height) credits-pace))
|
||||||
|
(center (/ (- (+ credits-start credits-end) (credit-height credit)) 2.0))
|
||||||
|
(ease-height (* (line-height) easing))
|
||||||
|
(ease-speed (lambda (y) (* speed (sin (/ y ease-height)))))
|
||||||
|
;; Amount that credits scroll up during easing
|
||||||
|
(ease-travel (* ease-height (/ pi 2.0)))
|
||||||
|
;; Start below center so that it eases right into the center
|
||||||
|
(beg (+ center (- ease-travel ease-height)))
|
||||||
|
(beg-mid (- beg ease-travel))
|
||||||
|
(end-mid (- beg-mid (* (line-height) padding)))
|
||||||
|
(end (- end-mid ease-travel)))
|
||||||
(make-credit
|
(make-credit
|
||||||
#:lines (+ padding (* 2 fade) (credit-lines credit))
|
#:lines (+ padding (* 2 easing) (credit-lines credit))
|
||||||
#:draw (lambda (y) ((credit-draw credit) (+ y offset)))
|
#:draw (lambda (y) ((credit-draw credit) (+ y offset)))
|
||||||
#:update
|
#:update
|
||||||
|
;; Remember that y is decreasing as credits rise up the screen
|
||||||
|
;; toward y=0, so the comparators might seem to be flipped but
|
||||||
|
;; that's how they need to be.
|
||||||
(lambda (y)
|
(lambda (y)
|
||||||
(when (<= y beg)
|
(when (and (<= y beg) (> y end))
|
||||||
(cond
|
(cond
|
||||||
((> y (- center (* (line-height) fade)))
|
((> y beg-mid)
|
||||||
;; Accelerate
|
;; Accelerate
|
||||||
(set! offset (+ offset (/ (- beg y) 2 fade credits-pace))))
|
(set! offset (+ offset (ease-speed (- beg y)))))
|
||||||
((> y (- center (* (line-height) (+ fade padding))))
|
((> y end-mid)
|
||||||
;; Match speed
|
;; Match speed
|
||||||
(set! offset (+ offset (/ (line-height) credits-pace))))
|
(set! offset (+ offset speed))
|
||||||
((> y end)
|
(when on-enter-center
|
||||||
;; Decelarate
|
(on-enter-center)
|
||||||
(set! offset (+ offset (/ (- y end) 2 fade credits-pace))))))
|
(set! on-enter-center #f)))
|
||||||
|
(else
|
||||||
|
;; Decelerate
|
||||||
|
(when on-leave-center
|
||||||
|
(on-leave-center)
|
||||||
|
(set! on-leave-center #f))
|
||||||
|
(set! offset (+ offset (ease-speed (- y end)))))))
|
||||||
|
;; Call on-leave-center even if no easing is used
|
||||||
|
(when (and (<= y end) on-leave-center)
|
||||||
|
(on-leave-center)
|
||||||
|
(set! on-leave-center #f))
|
||||||
((credit-update credit) (+ y offset)))
|
((credit-update credit) (+ y offset)))
|
||||||
#:on-enter (credit-on-enter credit)
|
#:on-enter (credit-on-enter credit)
|
||||||
#:on-leave (credit-on-leave credit))))
|
#:on-leave (credit-on-leave credit))))
|
||||||
|
|
||||||
(define (make-credits)
|
(define (make-credits)
|
||||||
(vector (make-credit-group
|
(vector (make-credit-centering
|
||||||
|
(make-credit-group
|
||||||
(make-credit-text "Phew, you made it!")
|
(make-credit-text "Phew, you made it!")
|
||||||
(make-credit-text "Time to relax."))
|
(make-credit-text "Time to relax.")))
|
||||||
(make-credit-centering
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-text "Cirkoban was made by the")
|
(make-credit-text "Cirkoban was made by the")
|
||||||
(make-credit-text "Spritely Institute")))
|
(make-credit-text "Spritely Institute")))
|
||||||
(make-credit-text "https://spritely.institute")
|
(make-credit-centering
|
||||||
|
(make-credit-text "https://spritely.institute"))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Game Design")
|
(make-credit-underline "Game Design")
|
||||||
(make-credit-text "Christine Lemmer-Webber"))
|
(make-credit-text "Christine Lemmer-Webber")))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Level Design")
|
(make-credit-underline "Level Design")
|
||||||
(make-credit-text "Christine Lemmer-Webber")
|
(make-credit-text "Christine Lemmer-Webber")
|
||||||
(make-credit-text "Juliana Sims")
|
(make-credit-text "Juliana Sims")
|
||||||
(make-credit-text "David Thompson"))
|
(make-credit-text "David Thompson"))
|
||||||
|
#:on-enter-center (lambda () (pk "Level Design centering!!"))
|
||||||
|
#:on-leave-center (lambda () (pk "Level Design leaving center!!")))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Pixel Art")
|
(make-credit-underline "Pixel Art")
|
||||||
(make-credit-text "Christine Lemmer-Webber"))
|
(make-credit-text "Christine Lemmer-Webber"))
|
||||||
|
#:easing 0
|
||||||
|
#:on-enter-center (lambda () (pk "Pixel Art centering!!"))
|
||||||
|
#:on-leave-center (lambda () (pk "Pixel Art leaving center!!")))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Music")
|
(make-credit-underline "Music")
|
||||||
(make-credit-text "EncryptedWhispers")
|
(make-credit-text "EncryptedWhispers")
|
||||||
(make-credit-text "Christine Lemmer-Webber"))
|
(make-credit-text "Christine Lemmer-Webber")))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Programming")
|
(make-credit-underline "Programming")
|
||||||
(make-credit-text "Juliana Sims")
|
(make-credit-text "Juliana Sims")
|
||||||
(make-credit-text "David Thompson")
|
(make-credit-text "David Thompson")
|
||||||
(make-credit-text "Amy Grinn"))
|
(make-credit-text "Amy Grinn")))
|
||||||
|
(make-credit-centering
|
||||||
(make-credit-group
|
(make-credit-group
|
||||||
(make-credit-underline "Other")
|
(make-credit-underline "Other")
|
||||||
(make-credit-text "monogram font by datagoblin"))
|
(make-credit-text "monogram font by datagoblin")))
|
||||||
(make-credit-centering
|
(make-credit-centering
|
||||||
(make-credit-text "Thank you for playing!")
|
(make-credit-text "Thank you for playing!"))))
|
||||||
#:fade 1)))
|
|
||||||
|
|
||||||
(define-record-type <credits>
|
(define-record-type <credits>
|
||||||
(make-credits-state credits top first-visible-index next-visible-index)
|
(make-credits-state credits top first-visible-index next-visible-index)
|
||||||
|
@ -572,7 +609,8 @@
|
||||||
(<= y credits-start))
|
(<= y credits-start))
|
||||||
(let ((c (vector-ref (credits) i)))
|
(let ((c (vector-ref (credits) i)))
|
||||||
((credit-draw c) y)
|
((credit-draw c) y)
|
||||||
(lp (1+ i) (+ y (credit-height c) credits-margin))))))
|
(lp (1+ i) (+ y (credit-height c) (* (line-height)
|
||||||
|
credits-margin)))))))
|
||||||
|
|
||||||
(define (update-credits!)
|
(define (update-credits!)
|
||||||
(let ((i (credits-first-visible-index)))
|
(let ((i (credits-first-visible-index)))
|
||||||
|
@ -588,12 +626,12 @@
|
||||||
((credit-on-enter c))
|
((credit-on-enter c))
|
||||||
(set-credits-next-visible-index! i))
|
(set-credits-next-visible-index! i))
|
||||||
((credit-update c) y)
|
((credit-update c) y)
|
||||||
(lp (1+ i) (+ y (credit-height c) credits-margin)))))
|
(lp (1+ i) (+ y (credit-height c) (* (line-height) credits-margin))))))
|
||||||
;; Remove credits as they leave the screen
|
;; Remove credits as they leave the screen
|
||||||
(let* ((c (vector-ref (credits) i))
|
(let* ((c (vector-ref (credits) i))
|
||||||
(bottom (+ (credits-top) (credit-height c))))
|
(bottom (+ (credits-top) (credit-height c))))
|
||||||
(when (< bottom credits-end)
|
(when (< bottom credits-end)
|
||||||
(set-credits-top! (+ bottom credits-margin))
|
(set-credits-top! (+ bottom (* (line-height) credits-margin)))
|
||||||
(set-credits-first-visible-index! (1+ i))
|
(set-credits-first-visible-index! (1+ i))
|
||||||
((credit-on-leave c))))
|
((credit-on-leave c))))
|
||||||
;; Advance credits
|
;; Advance credits
|
||||||
|
@ -946,7 +984,6 @@
|
||||||
;; + num menu items + 1 for ellipses if num items is too big
|
;; + num menu items + 1 for ellipses if num items is too big
|
||||||
;; + the y padding again
|
;; + the y padding again
|
||||||
(let* ((padding-y 1)
|
(let* ((padding-y 1)
|
||||||
(text-offset-y (* 0.75 tile-height))
|
|
||||||
(width 8.0)
|
(width 8.0)
|
||||||
(num-items (vector-length (menu-items (current-menu))))
|
(num-items (vector-length (menu-items (current-menu))))
|
||||||
(height (+ 2 ;; Menu title + back/ellipses
|
(height (+ 2 ;; Menu title + back/ellipses
|
||||||
|
|
Loading…
Add table
Reference in a new issue