diff options
| author | Gene Pasquet <dev@etenil.net> | 2026-04-06 03:41:09 +0100 |
|---|---|---|
| committer | Gene Pasquet <dev@etenil.net> | 2026-04-06 03:41:09 +0100 |
| commit | 78a924defabc862a7cfa5476091152c1ef5333ee (patch) | |
| tree | 5e7e13ca27848dfe87ecf3eb82689d8e9488beb3 /demo/menu.scm | |
| parent | c4ebbbdd1a0bd081a2ed9447ba8188d97ae54717 (diff) | |
Fixes, updated license
Diffstat (limited to 'demo/menu.scm')
| -rw-r--r-- | demo/menu.scm | 70 |
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*) |
