diff options
author | Gene Pasquet <dev@etenil.net> | 2024-05-25 07:04:43 +0100 |
---|---|---|
committer | Gene Pasquet <dev@etenil.net> | 2024-05-25 07:04:43 +0100 |
commit | ea6c66ebd5299f0b07352643ba533f74c83501c1 (patch) | |
tree | 1a64805cc03a84ac98a3f3e1d8082b6924aeda33 | |
parent | 6003a9df9a93477e0279ec681b82ce826484ee4e (diff) |
Add game menu!
-rw-r--r-- | TODO.org | 3 | ||||
-rw-r--r-- | turbo.scm | 247 |
2 files changed, 170 insertions, 80 deletions
@@ -14,7 +14,8 @@ ** DONE Display level on screen ** DONE Level up automatically ** DONE Add graphical speedometer (look at knight rider) -** TODO Add start menu +** DONE Add start menu +** TODO Add help menu to display controls ** TODO Add weapon to player car *** TODO Make weapon a power-up *** TODO Make weapon use limited (bullet? time?) @@ -88,7 +88,11 @@ ;; TODO: nope, bug here somewhere! (set-vehicle-active! (car vehicles) #t) -(define game-over #f) +(define game-started? #f) +(define game-over? #f) +(define show-credits? #f) +(define menu-items (list 'new-game 'credits 'quit)) +(define menu-selection 0) (define (vehicle-has-spawn-space? vehicle) (define (vehicle-in-the-way? v) @@ -182,6 +186,18 @@ (and vehicle-active? (>= (- vehicle-length) (vec2-x (vehicle-position veh))))) +(define (reset-game!) + (set! player-distance-travelled 0) + (set! level-difficulty 1) + (set-vehicle-position! player-car initial-player-position) + (set-player-speed! (level-min-speed)) + (set! player-rotation 0) + (source-play engine-sound) + (for-each vehicle-reset-ahead vehicles) + ;; Reset all vehicles + (set! game-over? #f) + (set! game-started? #t)) + ;;;; Chickadee hooks (set-source-volume! music 0.5) @@ -190,65 +206,59 @@ (source-play engine-sound) (define (update interval) - (unless game-over - (unless (player-on-road?) - (off-road-player) - (set! game-over #t)) - - - (set! player-distance-travelled (+ player-distance-travelled (* interval (vehicle-speed player-car)))) - - ;; Increase level every 2 miles - (when (and (< level-difficulty 20) (> (distance-in-miles) (* 2 level-difficulty))) - (set! level-difficulty (+ 1 level-difficulty))) - - (let ((new-speed (+ (vehicle-speed player-car) - (* player-current-acceleration interval)))) - (set-vehicle-speed! player-car (min player-max-speed - (max (level-min-speed) - new-speed)))) - - (when (player-collides?) - (off-road-player) - ;; TODO: Think of different animation for this game over - (set! game-over #t)) - - (set! road-section-position - (if (< road-section-position (- lane-length)) - (- (+ road-section-position lane-length) (* interval (vehicle-speed player-car))) - (- road-section-position (* interval (vehicle-speed player-car))))) - - (set-vehicle-position! player-car (vec2+ (vehicle-position player-car) - player-velocity)) - - (for-each (lambda (veh) - (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0))) - (filter vehicle-active? vehicles)) - - ;; Reset vehicles that have gone off screen - (for-each vehicle-reset-ahead (filter vehicle-off-screen? vehicles)) - - ;; Randomly respawn vehicles based on level difficulty - (let ((challenge (- (round (/ 200 level-difficulty)) 9))) - (when (= 0 (random challenge)) - (let* ((inactive-vehicles (filter vehicle-inactive? vehicles)) - (spawnable-vehicles (filter vehicle-has-spawn-space? inactive-vehicles))) - (if (not (null? spawnable-vehicles)) - (set-vehicle-active! (list-ref - spawnable-vehicles - (random (length spawnable-vehicles))) - #t))))) - ;; End (unless game-over) - )) + (unless game-over? + (unless (player-on-road?) + (off-road-player) + (set! game-over? #t)) + + + (set! player-distance-travelled (+ player-distance-travelled (* interval (vehicle-speed player-car)))) + + ;; Increase level every 2 miles + (when (and (< level-difficulty 20) (> (distance-in-miles) (* 2 level-difficulty))) + (set! level-difficulty (+ 1 level-difficulty))) + + (let ((new-speed (+ (vehicle-speed player-car) + (* player-current-acceleration interval)))) + (set-vehicle-speed! player-car (min player-max-speed + (max (level-min-speed) + new-speed)))) + + (when (and game-started? (player-collides?)) + (off-road-player) + ;; TODO: Think of different animation for this game over + (set! game-over? #t)) + + (set! road-section-position + (if (< road-section-position (- lane-length)) + (- (+ road-section-position lane-length) (* interval (vehicle-speed player-car))) + (- road-section-position (* interval (vehicle-speed player-car))))) + + (set-vehicle-position! player-car (vec2+ (vehicle-position player-car) + player-velocity)) + + (for-each (lambda (veh) + (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0))) + (filter vehicle-active? vehicles)) + + ;; Reset vehicles that have gone off screen + (for-each vehicle-reset-ahead (filter vehicle-off-screen? vehicles)) + + ;; Randomly respawn vehicles based on level difficulty + (let ((challenge (- (round (/ 200 level-difficulty)) 9))) + (when (= 0 (random challenge)) + (let* ((inactive-vehicles (filter vehicle-inactive? vehicles)) + (spawnable-vehicles (filter vehicle-has-spawn-space? inactive-vehicles))) + (if (not (null? spawnable-vehicles)) + (set-vehicle-active! (list-ref + spawnable-vehicles + (random (length spawnable-vehicles))) + #t))))) + ;; End (unless game-over?) + )) (define (draw alpha) (draw-road road-section-position road-start-y road-num-lanes) - (draw-text "Turbo Racer 3000!" - (vec2 300.0 (- (window-height (current-window)) 25)) - #:font the-font - #:scale (vec2 2 2)) - - (draw-sprite (vehicle-sprite player-car) (vehicle-position player-car) #:rotation player-rotation) (for-each (lambda (veh) (draw-sprite (vehicle-sprite veh) (vehicle-position veh))) @@ -259,6 +269,72 @@ (when (< (+ index (texture-width dash-background)) (window-width (current-window))) (loop (+ index (texture-width dash-background))))) + (draw-sprite (vehicle-sprite player-car) (vehicle-position player-car) #:rotation player-rotation) + (unless game-started? + (let ((window-top (window-height (current-window)))) + (if show-credits? + (let ((left-margin 60) + (top-start 125) + (gap 25)) + (draw-text "TURBO RACER 3000!" + (vec2 left-margin (- window-top top-start)) + #:font the-font + #:scale (vec2 4 4) + #:color red) + (draw-text "DEVELOPMENT: Gene Pasquet" + (vec2 left-margin (- window-top (+ top-start gap))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "DESIGN: Owen Pasquet" + (vec2 left-margin (- window-top (+ top-start (* 2 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "PLAY TESTING: Owen Pasquet" + (vec2 left-margin (- window-top (+ top-start (* 3 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "MUSIC: Instrumental by Aries Beats" + (vec2 left-margin (- window-top (+ top-start (* 4 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "FONTS: Keshikan" + (vec2 left-margin (- window-top (+ top-start (* 5 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "SOUND: qubodup" + (vec2 left-margin (- window-top (+ top-start (* 6 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "BACK" + (vec2 250 (- window-top 330)) + #:font the-font + #:scale (vec2 2 2) + #:color yellow) + ) + (begin + ;; Draw the menu + (draw-text "TURBO RACER 3000!" + (vec2 60 (- window-top 125)) + #:font the-font + #:scale (vec2 4 4) + #:color red) + (draw-text "NEW GAME" + (vec2 250 (- window-top 250)) + #:font the-font + #:scale (vec2 2 2) + #:color (if (= menu-selection 0) yellow white)) + (draw-text "CREDITS" + (vec2 250 (- window-top 270)) + #:font the-font + #:scale (vec2 2 2) + #:color (if (= menu-selection 1) yellow white)) + (draw-text "QUIT" + (vec2 250 (- window-top 330)) + #:font the-font + #:scale (vec2 2 2) + #:color (if (= menu-selection 2) yellow white)))))) + + (draw-sprite dash-7seg-background (vec2 270 0)) (draw-sprite dash-7seg-background (vec2 324 0)) (draw-text (format #f "~5,1,,,'0f" (distance-in-miles)) @@ -270,6 +346,7 @@ #:font the-font #:scale (vec2 2 2)) + (draw-sprite dash-7seg-background (vec2 450 0)) (draw-sprite dash-7seg-background (vec2 503 0)) (draw-text (format #f "~5,1,,,'0f" (speed-in-mph)) @@ -293,7 +370,7 @@ #:font the-font #:scale (vec2 2 2)) - (if game-over + (if game-over? (draw-text "GAME OVER" (vec2 260 (/ (window-width (current-window)) 2)) #:font the-font #:scale (vec2 2 2)))) @@ -301,30 +378,42 @@ (define (key-press key modifiers repeat?) (cond - ((eq? key 'w) - (set! player-velocity (vec2 0 vehicle-steering-speed))) - ((eq? key 's) - (set! player-velocity (vec2 0 (- vehicle-steering-speed)))) - ((eq? key 'd) + ((or (eq? key 'w) (eq? key 'up)) + (if game-started? + (set! player-velocity (vec2 0 vehicle-steering-speed)) + (set! menu-selection (max 0 (- menu-selection 1))))) + ((or (eq? key 's) (eq? key 'down)) + (if game-started? + (set! player-velocity (vec2 0 (- vehicle-steering-speed))) + (set! menu-selection (min (- (length menu-items) 1) (+ menu-selection 1))))) + ((or (eq? key 'd) (eq? key 'right)) (set! player-current-acceleration player-car-acceleration)) - ((eq? key 'a) + ((or (eq? key 'a) (eq? key 'left)) (set! player-current-acceleration player-car-deceleration)) ((eq? key 'escape) - (abort-game)) - ((and (eq? key 'return) game-over) - (set! player-distance-travelled 0) - (set! level-difficulty 1) - (set-vehicle-position! player-car initial-player-position) - (set-player-speed! (level-min-speed)) - (set! player-rotation 0) - (source-play engine-sound) - (for-each vehicle-reset-ahead vehicles) - ;; Reset all vehicles - (set! game-over #f)))) + (set! game-started? #f)) + ((and (eq? key 'return) game-over?) + (reset-game!)) + ((and (eq? key 'return) (not game-started?)) + (if show-credits? + (set! show-credits? #f) + (cond + ((= menu-selection 0) + (reset-game!)) + ((= menu-selection 1) + (set! show-credits? #t)) + ((= menu-selection 2) + (abort-game))))))) (define (key-release key modifiers) (cond - ((or (eq? key 'a) (eq? key 'd)) - (set! player-current-acceleration 0))) - (if (or (eq? key 'w) (eq? key 's)) - (set! player-velocity (vec2 0 0)))) + ((or (eq? key 'a) + (eq? key 'd) + (eq? key 'left) + (eq? key 'right)) + (set! player-current-acceleration 0)) + ((or (eq? key 'w) + (eq? key 's) + (eq? key 'up) + (eq? key 'down)) + (set! player-velocity (vec2 0 0))))) |