Refactoring menu drawing
This commit is contained in:
parent
89fa09c387
commit
4a46d3d1d1
1 changed files with 43 additions and 29 deletions
58
game.scm
58
game.scm
|
@ -326,6 +326,7 @@
|
|||
'menu menu:level-select)
|
||||
(make-menu-item "Credits" 'credits))))
|
||||
|
||||
;; -1 for the index means 'Back' will be indicated first
|
||||
(define *menu* (make-menu-state menu:main -1 0 '()))
|
||||
|
||||
(define (current-menu)
|
||||
|
@ -750,45 +751,58 @@
|
|||
(height (+ 2 ;; Menu title + back/ellipses
|
||||
(* 2 padding-y) ;; Padding
|
||||
(if (> num-items menu:max-items)
|
||||
(1+ menu:max-items)
|
||||
(1+ menu:max-items) ;; bottom ellipses
|
||||
num-items)))
|
||||
(r-start (- -2 padding-y))
|
||||
(r-end (- (+ r-start height) padding-y))
|
||||
(gutter-x (- (vec2-x center) (* tile-width (1- (floor (/ width 2))))))
|
||||
(text-x (+ tile-width gutter-x)))
|
||||
(let row ((r r-start)
|
||||
(y (- (vec2-y center) (* tile-height (floor (/ height 2))))))
|
||||
(y-start (- (vec2-y center) (* tile-height
|
||||
(floor (/ height 2)))))
|
||||
(x-start (- (vec2-x center) (* tile-width
|
||||
(floor (/ width 2))))))
|
||||
|
||||
;; Draw menu background
|
||||
(when (= r r-start)
|
||||
(let ((x (- (vec2-x center) (* tile-width (floor (/ width 2)))))
|
||||
(w (* tile-width width))
|
||||
(let ((w (* tile-width width))
|
||||
(h (* tile-height height)))
|
||||
(set-fill-color! context "#000")
|
||||
(fill-rect context x y w h)
|
||||
(fill-rect context x-start y-start w h)
|
||||
(set-stroke-color! context "blue")
|
||||
(stroke-rect context x y w h)))
|
||||
(stroke-rect context x-start y-start w h))
|
||||
|
||||
;; Draw menu text
|
||||
(let ((r-menu-index (- (+ r (* (current-menu-page) menu:max-items)) (current-menu-page))))
|
||||
(set-font! context "normal 16px monogram")
|
||||
(set-fill-color! context "#fff")
|
||||
(let* (;; The first menu item is at index 0. The 'Back' or ellipses are
|
||||
;; directly above the first menu item at index -1. The menu title
|
||||
;; is above the 'Back' button and separated by the padding-y
|
||||
(r-start (- -2 padding-y))
|
||||
;; end of text
|
||||
(r-end (- (+ r-start height) padding-y))
|
||||
;; r will not take into account which page you are on
|
||||
(r-page-offset (- (* (current-menu-page) menu:max-items) (current-menu-page)))
|
||||
(gutter-x (+ tile-width x-start))
|
||||
(text-x (+ tile-width gutter-x)))
|
||||
(do ((r r-start (1+ r)) (y y-start (+ tile-height y)))
|
||||
((or (>= r r-end) (>= (+ r r-page-offset) num-items)))
|
||||
;; Draw menu title
|
||||
(when (= r r-start)
|
||||
(set-text-align! context "center")
|
||||
(fill-text context (menu-name (current-menu)) (vec2-x center) (+ y text-offset-y)))
|
||||
(fill-text context (menu-name (current-menu))
|
||||
(vec2-x center) (+ y text-offset-y)))
|
||||
(set-text-align! context "left")
|
||||
(when (= r-menu-index (current-menu-index))
|
||||
;; indicator
|
||||
(when (= (+ r r-page-offset) (current-menu-index))
|
||||
(fill-text context "▸" gutter-x (+ y text-offset-y)))
|
||||
;; Menu items
|
||||
(when (>= r -1)
|
||||
(fill-text context
|
||||
(cond
|
||||
((= r-menu-index -1) "Back")
|
||||
((or (= r -1) (and (= r (1- r-end)) (< r-menu-index (1- num-items))))
|
||||
((= (+ r r-page-offset) -1) "Back")
|
||||
((or (= r -1) (and (= r (1- r-end))
|
||||
(< (+ r r-page-offset) (1- num-items))))
|
||||
"...")
|
||||
(else
|
||||
(menu-item-name (vector-ref (menu-items (current-menu)) r-menu-index))))
|
||||
text-x (+ y text-offset-y)))
|
||||
;; Draw next row
|
||||
(when (and (< (1+ r) r-end) (< (1+ r-menu-index) num-items))
|
||||
(row (1+ r) (+ y tile-height)))))))
|
||||
(menu-item-name
|
||||
(vector-ref (menu-items (current-menu))
|
||||
(+ r r-page-offset)))))
|
||||
text-x (+ y text-offset-y)))))))
|
||||
|
||||
(define (draw-level)
|
||||
(draw-background)
|
||||
|
|
Loading…
Add table
Reference in a new issue