aboutsummaryrefslogtreecommitdiff
path: root/turbo.scm
diff options
context:
space:
mode:
Diffstat (limited to 'turbo.scm')
-rw-r--r--turbo.scm274
1 files changed, 168 insertions, 106 deletions
diff --git a/turbo.scm b/turbo.scm
index 1d0d293..34b8e0b 100644
--- a/turbo.scm
+++ b/turbo.scm
@@ -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))