(import scheme (chicken base) (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") downstroke-engine downstroke-renderer downstroke-input) (define *menu-cursor* 0) (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 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) (game-add-state! game 'main-menu (make-game-state #:update main-menu-update #:render main-menu-render)) (game-add-state! game 'playing (make-game-state #:update playing-update #:render playing-render)) (game-start-state! game 'main-menu)))) (game-run! *game*)