Drawing menu to the screen with text

Also allows user to step up and down the menu.

No action is performed when confirming a menu item yet.

Can't handle menus larger than the screen yet.
This commit is contained in:
Amy Grinn 2024-12-11 17:44:00 -05:00
parent 60b998758d
commit 7bf1d20147
No known key found for this signature in database
GPG key ID: 6B558BED1DCF3192

View file

@ -273,12 +273,21 @@
(load-level! *level-idx*) (load-level! *level-idx*)
(media-play audio:bg-music))))) (media-play audio:bg-music)))))
(define (toggle-menu!) (define (show-menu!)
(cond
(*menu* (set! *menu* #f))
(else
(set! *menu* menu:main) (set! *menu* menu:main)
(set! *menu:index* 0)))) (set! *menu:index* 0))
(define (menu-up!)
(set! *menu:index* (max -1 (1- *menu:index*))))
(define (menu-down!)
(set! *menu:index* (min (1- (vector-length *menu*)) (1+ *menu:index*))))
(define (hide-menu!)
(set! *menu* #f))
(define (menu-select!)
"TODO select the current index of the menu.")
(define (reset-game!) (define (reset-game!)
(run-script (run-script
@ -621,18 +630,47 @@
(define menu:main #(("Select Level" . menu:level-select) (define menu:main #(("Select Level" . menu:level-select)
("Credits" . menu:credits))) ("Credits" . menu:credits)))
;; (define menu:level-select (define menu:level-select
;; (vector-map (let ((menu (make-vector (vector-length levels))))
;; (lambda (i val) (do ((i 0 (1+ i)))
;; (cons (string-append "Level " (string->number i)) i)) ((= i (vector-length levels)))
;; levels)) (vector-set! menu i (cons (string-append "Level " (number->string i))
(vector-ref levels i))))
menu))
(define center (vec2 (* 10.0 tile-width) (* 7.0 tile-height)))
(define (draw-menu) (define (draw-menu)
(do ((x (* 7 tile-width) (+ tile-width x))) (set-text-align! context "center")
((> x (* 13 tile-width))) (set-font! context "normal 16px monogram")
(do ((y 0 (+ tile-height y))) (set-fill-color! context "#fff")
((> y (* 15 tile-height))) ;; Height (in tiles) will be 1 for the menu title + the y padding
(draw-tile context tileset 23 x y)))) ;; + 1 for the back button + num menu items + the y padding again
(let* ((padding-y 1)
(text-offset-y (* 0.75 tile-height))
(width 6)
(height (min level-height (+ 2 (* 2 padding-y) (vector-length *menu*))))
(r-start (- -2 padding-y)))
(let row ((r r-start)
(y (- (vec2-y center) (* tile-height (floor (/ height 2))))))
;; Draw menu background
(do ((c (- (floor (/ width 2))) (1+ c)))
((= c (floor (/ width 2))))
(let ((x (+ (vec2-x center) (* tile-width c))))
(draw-tile context tileset 109 x y)))
;; Draw menu text
(cond
((= r r-start)
(fill-text context "Menu" (vec2-x center) (+ y text-offset-y)))
((and (>= r -1) (< r (vector-length *menu*)))
(let* ((item (or (and (= r -1) "Back")
(car (vector-ref *menu* r))))
(text (string-append (or (and (= r *menu:index*) "▸ ") " ")
item)))
(fill-text context text (vec2-x center) (+ y text-offset-y)))))
;; Draw next row
(if (< (1+ r) (+ r-start height))
(row (1+ r) (+ y tile-height))))))
(define (draw-level) (define (draw-level)
(draw-background) (draw-background)
@ -869,6 +907,14 @@
(on-input-down 'undo)))))))) (on-input-down 'undo))))))))
(define (on-input-down input) (define (on-input-down input)
(cond
(*menu*
(match input
('up (menu-up!))
('down (menu-down!))
('confirm (menu-select!))
('menu (hide-menu!))))
(else
(match *state* (match *state*
('play ('play
(match input (match input
@ -880,10 +926,10 @@
(rollback-snapshot!) (rollback-snapshot!)
(with-goblins (update-objects!))) (with-goblins (update-objects!)))
;; REMOVE BEFORE RELEASE!!!! ;; REMOVE BEFORE RELEASE!!!!
;; ('confirm (next-level!)) ('confirm (next-level!))
('menu (toggle-menu!)))) ('menu (show-menu!))))
;; Pressing any bound input resets the game. ;; Pressing any bound input resets the game.
('win (reset-game!)))) ('win (reset-game!))))))
;; Canvas and event loop setup ;; Canvas and event loop setup
(define canvas (get-element-by-id "canvas")) (define canvas (get-element-by-id "canvas"))