(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*)