aboutsummaryrefslogtreecommitdiff
path: root/demo/menu.scm
diff options
context:
space:
mode:
Diffstat (limited to 'demo/menu.scm')
-rw-r--r--demo/menu.scm92
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*)