diff options
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*) |
