aboutsummaryrefslogtreecommitdiff
path: root/demo/menu.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-06 03:41:09 +0100
committerGene Pasquet <dev@etenil.net>2026-04-06 03:41:09 +0100
commit78a924defabc862a7cfa5476091152c1ef5333ee (patch)
tree5e7e13ca27848dfe87ecf3eb82689d8e9488beb3 /demo/menu.scm
parentc4ebbbdd1a0bd081a2ed9447ba8188d97ae54717 (diff)
Fixes, updated license
Diffstat (limited to 'demo/menu.scm')
-rw-r--r--demo/menu.scm70
1 files changed, 70 insertions, 0 deletions
diff --git a/demo/menu.scm b/demo/menu.scm
new file mode 100644
index 0000000..2564bd0
--- /dev/null
+++ b/demo/menu.scm
@@ -0,0 +1,70 @@
+(import scheme
+ (chicken base)
+ (prefix sdl2 "sdl2:")
+ (prefix sdl2-ttf "ttf:")
+ downstroke-engine
+ 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 *game*
+ (make-game
+ title: "Demo: Menu System" width: 600 height: 400
+
+ 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)))
+
+ 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
+ (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
+ (game-start-state! game 'main-menu))))
+
+(game-run! *game*)