diff options
32 files changed, 224 insertions, 108 deletions
diff --git a/.gitattributes b/.gitattributes index cb1555c..49bf92c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.AppImage filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.ase filter=lfs diff=lfs merge=lfs -text @@ -1,5 +1,5 @@ turbo.go: turbo.scm - guild compile -o turbo.go turbo.scm + guild compile -o turbo.scm.go turbo.scm .PHONY: play play: @@ -23,7 +23,11 @@ ** TODO Add weapon to player car *** TODO Make weapon a power-up *** TODO Make weapon use limited (bullet? time?) -** DONE Improve visuals +** TODO Improve visuals +*** STARTED Use animated sprites +*** TODO Change theme to night time +*** TODO Add public lighting +*** TODO Neons! ** TODO Reduce lanes to 3 from level 10 *** TODO Handle vehicles lane change for reductions ** DONE Add music diff --git a/fonts/thick_8x8.png b/fonts/thick_8x8.png Binary files differindex 8f5fd09..836c0b4 100644 --- a/fonts/thick_8x8.png +++ b/fonts/thick_8x8.png diff --git a/graphics-src/car-blue.ase b/graphics-src/car-blue.ase new file mode 100644 index 0000000..947b250 --- /dev/null +++ b/graphics-src/car-blue.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fab4f9299fd3c4076e5628554b3c3bd0f5c2acc722f43ef8dad48570cf95f22b +size 2050 diff --git a/graphics-src/car-green.ase b/graphics-src/car-green.ase new file mode 100644 index 0000000..0662f52 --- /dev/null +++ b/graphics-src/car-green.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:703dfce4b80d9e33602e291eb343569b87170832efc8e2d96c5b7613d37f43ae +size 2048 diff --git a/graphics-src/car.ase b/graphics-src/car.ase new file mode 100644 index 0000000..a90b32a --- /dev/null +++ b/graphics-src/car.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:464e6d0da27a0ecaca2f87ef2cedf66e51a2f583eee814bb1e4a589a0e943c92 +size 2051 diff --git a/graphics-src/car.png b/graphics-src/car.png Binary files differindex e05f52d..eaeefa2 100644 --- a/graphics-src/car.png +++ b/graphics-src/car.png diff --git a/graphics-src/palette.ase b/graphics-src/palette.ase new file mode 100644 index 0000000..0c9f1f1 --- /dev/null +++ b/graphics-src/palette.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd3d4e310205761d68e509ca9d1862939060612120ec319064b41f86d45ac708 +size 565 diff --git a/graphics-src/pick-up-blue.ase b/graphics-src/pick-up-blue.ase new file mode 100644 index 0000000..da07356 --- /dev/null +++ b/graphics-src/pick-up-blue.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8dd6d868790a8a29e04c4a67fd890e7486f07c331a9218a3c53a7fb54bf5b107 +size 1576 diff --git a/graphics-src/pick-up-green.ase b/graphics-src/pick-up-green.ase new file mode 100644 index 0000000..f4cc7be --- /dev/null +++ b/graphics-src/pick-up-green.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e42ec77e9ba827180f8f841ccc8ce3b8d9b3603b9ddce21fc640729fe808c73f +size 1576 diff --git a/graphics-src/pick-up-red.ase b/graphics-src/pick-up-red.ase new file mode 100644 index 0000000..a28684d --- /dev/null +++ b/graphics-src/pick-up-red.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23a87adeaf7a65b9b8d9933fefed3630ed32e415c388b9a7d165c9b4f3cacb4f +size 1579 diff --git a/graphics-src/pick-up-yellow.ase b/graphics-src/pick-up-yellow.ase new file mode 100644 index 0000000..4e93abd --- /dev/null +++ b/graphics-src/pick-up-yellow.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11a835ede0f973ad1d16f2cb3f287a7a8e71644c3518daf26761a53e77d1a91a +size 1576 diff --git a/graphics-src/pick-up.ase b/graphics-src/pick-up.ase new file mode 100644 index 0000000..da07356 --- /dev/null +++ b/graphics-src/pick-up.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8dd6d868790a8a29e04c4a67fd890e7486f07c331a9218a3c53a7fb54bf5b107 +size 1576 diff --git a/graphics-src/player-car.ase b/graphics-src/player-car.ase new file mode 100644 index 0000000..a522f33 --- /dev/null +++ b/graphics-src/player-car.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c26e08b2c4795f296327aedd4ab778a76f0b5827f722d7731a682cd51c75f24 +size 1862 diff --git a/graphics-src/player-car.gif b/graphics-src/player-car.gif Binary files differnew file mode 100644 index 0000000..8bdd64d --- /dev/null +++ b/graphics-src/player-car.gif diff --git a/graphics-src/player-car.png b/graphics-src/player-car.png Binary files differindex e67cbd7..514f371 100644 --- a/graphics-src/player-car.png +++ b/graphics-src/player-car.png diff --git a/graphics-src/road.ase b/graphics-src/road.ase new file mode 100644 index 0000000..3b547a0 --- /dev/null +++ b/graphics-src/road.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fe65e62c0859ee3b347277e4ece5aa7ea5194e10e5e0c4ba37145c8b450c818 +size 1267 diff --git a/graphics-src/tractor.png b/graphics-src/tractor.png Binary files differindex b3a88b6..570268b 100644 --- a/graphics-src/tractor.png +++ b/graphics-src/tractor.png diff --git a/graphics-src/truck-blue.ase b/graphics-src/truck-blue.ase new file mode 100644 index 0000000..63f3023 --- /dev/null +++ b/graphics-src/truck-blue.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b69869209a21362993f0112523566a42a7e8c0130bc3f7b28f0fee684ea9c13 +size 1896 diff --git a/graphics-src/truck-green.ase b/graphics-src/truck-green.ase new file mode 100644 index 0000000..c2191ef --- /dev/null +++ b/graphics-src/truck-green.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31ae31621df91cf632a497798aff9676741127088e74c0cc2df6457ee2efe961 +size 1892 diff --git a/graphics-src/truck-yellow.ase b/graphics-src/truck-yellow.ase new file mode 100644 index 0000000..1f5fdf6 --- /dev/null +++ b/graphics-src/truck-yellow.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19b05d33fcd9291e9328d66e59c11d64631d704d2d8ea97e091c63f5246818e8 +size 1898 diff --git a/graphics-src/truck.ase b/graphics-src/truck.ase new file mode 100644 index 0000000..f59f1e7 --- /dev/null +++ b/graphics-src/truck.ase @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fac13d3b80de4c91360820ad77d7a920a7e2b4ff1d235454d0a4069e3dc87a4 +size 1897 diff --git a/graphics-src/truck.png b/graphics-src/truck.png Binary files differindex d06c230..e2a23cf 100644 --- a/graphics-src/truck.png +++ b/graphics-src/truck.png diff --git a/sprites/7segment-background.png b/sprites/7segment-background.png Binary files differindex 56c1edd..cbf108f 100644 --- a/sprites/7segment-background.png +++ b/sprites/7segment-background.png diff --git a/sprites/dash-background.png b/sprites/dash-background.png Binary files differindex abb8e60..4db786c 100644 --- a/sprites/dash-background.png +++ b/sprites/dash-background.png diff --git a/sprites/grass.png b/sprites/grass.png Binary files differindex 64d1261..f968bd8 100644 --- a/sprites/grass.png +++ b/sprites/grass.png diff --git a/sprites/lamps.png b/sprites/lamps.png new file mode 100644 index 0000000..bc0b70e --- /dev/null +++ b/sprites/lamps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bf80f88dc7634561a9859b1d1204a049a96c0a2cb6ed06766c50be7c6f1feb6 +size 380 diff --git a/sprites/road.png b/sprites/road.png Binary files differindex c85bc43..7ce2012 100644 --- a/sprites/road.png +++ b/sprites/road.png diff --git a/sprites/vehicles.png b/sprites/vehicles.png Binary files differindex 5baa20e..e97d23f 100644 --- a/sprites/vehicles.png +++ b/sprites/vehicles.png diff --git a/turbo-icon.png b/turbo-icon.png Binary files differindex 328eea7..c195b70 100644 --- a/turbo-icon.png +++ b/turbo-icon.png @@ -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) @@ -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)) |