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:
parent
60b998758d
commit
7bf1d20147
1 changed files with 77 additions and 31 deletions
82
game.scm
82
game.scm
|
@ -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"))
|
||||||
|
|
Loading…
Add table
Reference in a new issue