diff options
Diffstat (limited to 'demo/menu.scm')
| -rw-r--r-- | demo/menu.scm | 92 |
1 files changed, 45 insertions, 47 deletions
diff --git a/demo/menu.scm b/demo/menu.scm index 2564bd0..322e046 100644 --- a/demo/menu.scm +++ b/demo/menu.scm @@ -6,11 +6,49 @@ downstroke-renderer downstroke-input) -;; Global state for menu cursor (define *menu-cursor* 0) -(define *menu-items* '("Play" "Quit")) -(define *title-font* #f) -(define *menu-font* #f) +(define *menu-items* '("Play" "Quit")) +(define *title-font* #f) +(define *menu-font* #f) + +(define +bg-color+ (sdl2:make-color 0 0 0 255)) +(define +text-color+ (sdl2:make-color 255 255 255 255)) + +(define (clear-screen! renderer) + (set! (sdl2:render-draw-color renderer) +bg-color+) + (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400))) + +;; ── States ─────────────────────────────────────────────────────────────────── + +(define (main-menu-update game _dt) + (let ((input (game-input game))) + (when (input-pressed? input 'up) + (set! *menu-cursor* (max 0 (- *menu-cursor* 1)))) + (when (input-pressed? input 'down) + (set! *menu-cursor* (min (- (length *menu-items*) 1) (+ *menu-cursor* 1)))) + (when (input-pressed? input 'a) + (case *menu-cursor* + ((0) (game-start-state! game 'playing)) + ((1) (sdl2:quit!) (exit)))))) + +(define (main-menu-render game) + (let ((renderer (game-renderer game))) + (clear-screen! renderer) + (draw-ui-text renderer *title-font* "MENU DEMO" +text-color+ 200 80) + (draw-menu-items renderer *menu-font* *menu-items* *menu-cursor* 150 150 50))) + +(define (playing-update game _dt) + (when (input-pressed? (game-input game) 'quit) + (set! *menu-cursor* 0) + (game-start-state! game 'main-menu))) + +(define (playing-render game) + (let ((renderer (game-renderer game))) + (clear-screen! renderer) + (draw-ui-text renderer *menu-font* + "PLAYING! PRESS ESC TO RETURN" +text-color+ 120 150))) + +;; ── Game ───────────────────────────────────────────────────────────────────── (define *game* (make-game @@ -18,53 +56,13 @@ preload: (lambda (game) (set! *title-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 24)) - (set! *menu-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 16))) + (set! *menu-font* (ttf:open-font "demo/assets/DejaVuSans.ttf" 16))) create: (lambda (game) - ;; Register the main-menu state (game-add-state! game 'main-menu - (make-game-state - #:update (lambda (game dt) - (let ((input (game-input game))) - ;; Navigate menu with up/down - (when (input-pressed? input 'up) - (set! *menu-cursor* (max 0 (- *menu-cursor* 1)))) - (when (input-pressed? input 'down) - (set! *menu-cursor* (min (- (length *menu-items*) 1) (+ *menu-cursor* 1)))) - ;; Confirm selection - (when (input-pressed? input 'a) - (case *menu-cursor* - ((0) ; Play - (game-start-state! game 'playing)) - ((1) ; Quit - (sdl2:quit!) - (exit)))))) - #:render (lambda (game) - (let ((renderer (game-renderer game))) - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 0 0 0 255)) - (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) - (let ((white (sdl2:make-color 255 255 255 255))) - (draw-ui-text renderer *title-font* "MENU DEMO" white 200 80) - (draw-menu-items renderer *menu-font* *menu-items* *menu-cursor* - 150 150 50)))))) - - ;; Register the playing state + (make-game-state #:update main-menu-update #:render main-menu-render)) (game-add-state! game 'playing - (make-game-state - #:update (lambda (game dt) - (let ((input (game-input game))) - ;; Return to menu on quit (Escape) - (when (input-pressed? input 'quit) - (set! *menu-cursor* 0) - (game-start-state! game 'main-menu)))) - #:render (lambda (game) - (let ((renderer (game-renderer game))) - (set! (sdl2:render-draw-color renderer) (sdl2:make-color 0 0 0 255)) - (sdl2:render-fill-rect! renderer (sdl2:make-rect 0 0 600 400)) - (let ((white (sdl2:make-color 255 255 255 255))) - (draw-ui-text renderer *menu-font* "PLAYING! PRESS ESC TO RETURN" white 120 150)))))) - - ;; Start with the main menu + (make-game-state #:update playing-update #:render playing-render)) (game-start-state! game 'main-menu)))) (game-run! *game*) |
