diff options
Diffstat (limited to 'turbo.scm')
-rw-r--r-- | turbo.scm | 280 |
1 files changed, 171 insertions, 109 deletions
@@ -13,6 +13,40 @@ (srfi srfi-1)) +(define-record-type <animated-sprite> + (make-animated-sprite sprites fps timer running?) + animated-sprite? + (sprites animated-sprite-sprites) + (fps animated-sprite-fps) + (timer animated-sprite-timer set-animated-sprite-timer!) + (running? animated-sprite-running? set-animated-sprite-running!)) + +(define (make-asprite sprites fps) + (make-animated-sprite sprites fps 0 #t)) + +(define (animated-sprite-frame-time sprite) + (/ 1 (animated-sprite-fps sprite))) + +(define (animated-sprite-max-timer sprite) + (let ((frame-time (animated-sprite-frame-time sprite))) + (* frame-time (length (animated-sprite-sprites sprite))))) + +(define (animated-sprite-animate! sprite elapsed-time) + (let ((timer (+ (animated-sprite-timer sprite) elapsed-time)) + (max-timer (animated-sprite-max-timer sprite))) + (set-animated-sprite-timer! sprite (if (>= timer max-timer) + (- max-timer timer) + timer)))) + +(define (animated-sprite->sprite sprite) + (if (animated-sprite-running? sprite) + (let* ((timer (animated-sprite-timer sprite)) + (frame-time (animated-sprite-frame-time sprite)) + (index (inexact->exact (floor (/ timer frame-time)))) + (sprite-ref (min (max 0 index) (- (length (animated-sprite-sprites sprite)) 1)))) + (list-ref (animated-sprite-sprites sprite) sprite-ref)) + (list-ref (animated-sprite-sprites sprite) 0))) + ;;;; Vehicles module (define vehicle-height 44) (define vehicle-length 100) @@ -59,9 +93,9 @@ ;;;; Constants and variables -(define assets-root (if (string=? (getenv "APPDIR") "") - "" - (format #f "~a/usr/share/turbo/" (getenv "APPDIR")))) +(define assets-root (if (getenv "APPDIR") + (format #f "~a/usr/share/turbo/" (getenv "APPDIR")) + "")) (define (asset-path asset) (format #f "~a~a" assets-root asset)) @@ -73,6 +107,7 @@ (define road-start-y 80) (define road-section-position 0) (define road #f) +(define lamps #f) (define road-num-lanes 5) (define road-end-y (+ road-start-y (* road-num-lanes lane-height))) (define road-top #f) @@ -124,13 +159,16 @@ (define (make-vehicle-list vehicle-list tile-ref) (if (< tile-ref (texture-atlas-size vehicles-sprites)) - (cons (make-inactive-vehicle (* 2 tile-ref) - (texture-atlas-ref vehicles-sprites tile-ref) - (random-lane-start-pos)) - (cons (make-inactive-vehicle (+ 1 (* 2 tile-ref)) - (texture-atlas-ref vehicles-sprites tile-ref) - (random-lane-start-pos)) - (make-vehicle-list vehicle-list (+ tile-ref 1)))) + (cons (make-inactive-vehicle + tile-ref + (make-asprite + (list (texture-atlas-ref vehicles-sprites tile-ref) + (texture-atlas-ref vehicles-sprites (+ 1 tile-ref)) + (texture-atlas-ref vehicles-sprites (+ 2 tile-ref)) + (texture-atlas-ref vehicles-sprites (+ 3 tile-ref))) + 6) + (random-lane-start-pos)) + (make-vehicle-list vehicle-list (+ tile-ref 4))) vehicle-list)) (define (vehicle-reset-ahead veh) @@ -180,6 +218,14 @@ (draw-road (+ startx lane-length) starty num-lanes) (draw-grass-up startx (+ starty (* lane-height num-lanes))))) +(define (draw-lamps startx starty num-lanes) + (when (< startx (window-width (current-window))) + (draw-sprite (texture-atlas-ref lamps 0) (vec2 startx starty)) + (draw-sprite (texture-atlas-ref lamps 1) (vec2 startx (+ starty (* lane-height (- num-lanes 1))))) + (draw-lamps (+ startx lane-length) starty num-lanes))) + +(display "KOIN\n") + (define (lane-y num-lane) (+ road-start-y (* lane-height (- num-lane 1)))) @@ -268,6 +314,7 @@ (set! the-font (load-bitmap-font (asset-path "fonts/thick_8x8.xml"))) (set! font-7-segments (load-font (asset-path "fonts/DSEG7Classic-Regular.ttf") 24)) (set! road (load-tileset (asset-path "sprites/road.png") lane-length lane-height)) + (set! lamps (load-tileset (asset-path "sprites/lamps.png") lane-length lane-height)) (set! road-top (texture-atlas-ref road 2)) (set! road-bottom (texture-atlas-ref road 0)) (set! road-lane (texture-atlas-ref road 1)) @@ -283,7 +330,13 @@ (/ (- lane-height vehicle-height) 2)))) (set! player-car (make-vehicle 0 - (texture-atlas-ref vehicles-sprites 0) + (make-asprite + (list + (texture-atlas-ref vehicles-sprites 0) + (texture-atlas-ref vehicles-sprites 1) + (texture-atlas-ref vehicles-sprites 2) + (texture-atlas-ref vehicles-sprites 3)) + 8) initial-player-position (+ 1 player-min-speed) #t)) @@ -295,7 +348,7 @@ (set! engine-sound (make-source #:audio engine-res #:loop? #t)) (set-source-volume! music 0.3) - (set! vehicles (make-vehicle-list (list) 1)) + (set! vehicles (make-vehicle-list (list) 4)) (for-each vehicle-reset-ahead vehicles) (set-vehicle-active! (car vehicles) #t) @@ -323,6 +376,8 @@ (* player-current-acceleration interval)))) (set-player-speed! new-speed)) + (animated-sprite-animate! (vehicle-sprite player-car) interval) + (when (and game-started? (player-collides?)) (off-road-player) ;; TODO: Think of different animation for this game over @@ -337,6 +392,7 @@ player-velocity)) (for-each (lambda (veh) + (animated-sprite-animate! (vehicle-sprite veh) interval) (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0))) (filter vehicle-active? vehicles)) @@ -360,7 +416,8 @@ (draw-road road-section-position road-start-y road-num-lanes) (for-each (lambda (veh) - (draw-sprite (vehicle-sprite veh) (vehicle-position veh))) + (draw-sprite (animated-sprite->sprite (vehicle-sprite veh)) + (vehicle-position veh))) (filter vehicle-active? vehicles)) (let loop ((index 0)) @@ -368,113 +425,118 @@ (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) + (draw-sprite (animated-sprite->sprite (vehicle-sprite player-car)) + (vehicle-position player-car) + #:rotation player-rotation) + + (draw-lamps road-section-position road-start-y road-num-lanes) + (unless game-started? - (let ((window-top (window-height (current-window)))) - (cond - (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))) - (show-help? - (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 "Complete 10miles fast!" - (vec2 left-margin (- window-top (+ top-start gap))) - #:font the-font - #:scale (vec2 2 2)) - (draw-text "Arrow keys or WASD control the car." - (vec2 left-margin (- window-top (+ top-start (* 2 gap)))) - #:font the-font - #:scale (vec2 2 2)) - (draw-text "ESCAPE for the main menu" - (vec2 left-margin (- window-top (+ top-start (* 3 gap)))) - #:font the-font - #:scale (vec2 2 2)) - (draw-text "" - (vec2 left-margin (- window-top (+ top-start (* 4 gap)))) - #:font the-font - #:scale (vec2 2 2)) - (draw-text "" - (vec2 left-margin (- window-top (+ top-start (* 5 gap)))) - #:font the-font - #:scale (vec2 2 2)) - (draw-text "" - (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))) - (else - ;; Draw the menu + (let ((window-top (window-height (current-window)))) + (cond + (show-credits? + (let ((left-margin 60) + (top-start 125) + (gap 25)) (draw-text "TURBO RACER 3000!" - (vec2 60 (- window-top 125)) + (vec2 left-margin (- window-top top-start)) #:font the-font #:scale (vec2 4 4) #:color red) - (draw-text "NEW GAME" - (vec2 250 (- window-top 250)) + (draw-text "DEVELOPMENT: Gene Pasquet" + (vec2 left-margin (- window-top (+ top-start gap))) #:font the-font - #:scale (vec2 2 2) - #:color (if (= menu-selection 0) yellow white)) - (draw-text "CREDITS" - (vec2 250 (- window-top 270)) + #: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) - #:color (if (= menu-selection 1) yellow white)) - (draw-text "HELP" - (vec2 250 (- window-top 290)) + #: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 (if (= menu-selection 2) yellow white)) - (draw-text "QUIT" - (vec2 250 (- window-top 350)) + #:color yellow))) + (show-help? + (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 "Complete 10miles fast!" + (vec2 left-margin (- window-top (+ top-start gap))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "Arrow keys or WASD control the car." + (vec2 left-margin (- window-top (+ top-start (* 2 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "ESCAPE for the main menu" + (vec2 left-margin (- window-top (+ top-start (* 3 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "" + (vec2 left-margin (- window-top (+ top-start (* 4 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "" + (vec2 left-margin (- window-top (+ top-start (* 5 gap)))) + #:font the-font + #:scale (vec2 2 2)) + (draw-text "" + (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 (if (= menu-selection 3) yellow white)))))) + #:color yellow))) + (else + ;; 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 "HELP" + (vec2 250 (- window-top 290)) + #:font the-font + #:scale (vec2 2 2) + #:color (if (= menu-selection 2) yellow white)) + (draw-text "QUIT" + (vec2 250 (- window-top 350)) + #:font the-font + #:scale (vec2 2 2) + #:color (if (= menu-selection 3) yellow white)))))) (draw-sprite dash-7seg-background (vec2 270 0)) |