aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2024-05-19 16:59:16 +0100
committerGene Pasquet <dev@etenil.net>2024-05-19 16:59:16 +0100
commit282af05d0c7980fdc25f7619129025647c55f04a (patch)
treefebcd27fb62dda66779b83fc561d3f071f225aac
parentec65a1ad4d0e4aa020511bcfc45c6741be7d4302 (diff)
Randomly add other vehicles
-rw-r--r--TODO.org7
-rw-r--r--turbo.scm81
2 files changed, 64 insertions, 24 deletions
diff --git a/TODO.org b/TODO.org
index dadb33d..e5f17e0 100644
--- a/TODO.org
+++ b/TODO.org
@@ -2,9 +2,10 @@
** DONE Detect when player leaves the road
** TODO Add non-player cars onto the road
-*** TODO Add constant van on one lane
-*** TODO Put van on random lane
-*** TODO Add multiple vehicles on different lanes
+*** DONE Add constant van on one lane
+*** DONE Put van on random lane
+*** DONE Add multiple vehicles on different lanes
+*** TODO Ensure vehicles don't overlap
** TODO Detect collision with other vehicles
** TODO Add weapon to player car
*** TODO Make weapon a power-up
diff --git a/turbo.scm b/turbo.scm
index 3d70b5d..c90052a 100644
--- a/turbo.scm
+++ b/turbo.scm
@@ -3,7 +3,8 @@
(chickadee graphics viewport)
(chickadee audio)
(ice-9 pretty-print)
- (ice-9 format))
+ (ice-9 format)
+ (srfi srfi-9))
;;;; Constants and variables
@@ -23,16 +24,16 @@
(define vehicle-height 45)
(define vehicle-length 100)
(define vehicle-steering-speed 4.0)
-(define vehicles (load-tileset "vehicles.png" vehicle-length vehicle-height))
+(define vehicles-sprites (load-tileset "vehicles.png" vehicle-length vehicle-height))
-(define player-car (texture-atlas-ref vehicles 0))
+(define player-car (texture-atlas-ref vehicles-sprites 0))
(define player-velocity (vec2 0 0))
(define player-min-speed 4)
(define player-max-speed 20)
(define player-speed (+ player-min-speed 1))
(define player-rotation 0)
-(define red-van (texture-atlas-ref vehicles 1))
+(define red-van (texture-atlas-ref vehicles-sprites 1))
(define red-van-initial-speed 4)
(define red-van-speed red-van-initial-speed)
@@ -40,6 +41,32 @@
(define music-res (load-audio "music.ogg"))
(define music (make-source #:audio music-res #:loop? #t))
+(define-record-type <vehicle>
+ (make-vehicle sprite position speed active?)
+ vechicle?
+ (sprite vehicle-sprite)
+ (position vehicle-position set-vehicle-position!)
+ (speed vehicle-speed set-vehicle-speed!)
+ (active? vehicle-active? set-vehicle-active!))
+
+(define (calculate-vehicle-position lane)
+ (vec2 (window-width (current-window))
+ (+ road-start-y
+ (* 65 (- lane 1))
+ (/ (- lane-height vehicle-height) 2))))
+
+(define (make-inactive-vehicle tile)
+ (make-vehicle tile (calculate-vehicle-position (random 5)) 4 #f))
+
+(define (make-vehicle-list vehicle-list tile-ref)
+ (if (< tile-ref (texture-atlas-size vehicles-sprites))
+ (cons (make-inactive-vehicle (texture-atlas-ref vehicles-sprites tile-ref))
+ (cons (make-inactive-vehicle (texture-atlas-ref vehicles-sprites tile-ref))
+ (make-vehicle-list vehicle-list (+ tile-ref 1))))
+ vehicle-list))
+
+(define vehicles (make-vehicle-list (list) 0))
+
(define game-over #f)
;;;; Game functions
@@ -78,14 +105,6 @@
(+ (lane-y 3)
(/ (- lane-height vehicle-height) 2))))
-(define (calculate-red-van-position lane)
- (vec2 (window-width (current-window))
- (+ road-start-y
- (* 65 (- lane 1))
- (/ (- lane-height vehicle-height) 2))))
-
-(define red-van-position (calculate-red-van-position 1))
-
(define (player-on-road?)
(and (> (vec2-y player-position) road-start-y)
(< (+ (vec2-y player-position) vehicle-height) road-end-y)))
@@ -108,10 +127,13 @@
(define (vehicle-hitbox vehicle-pos)
(rect (vec2-x vehicle-pos) (vec2-y vehicle-pos) vehicle-length vehicle-height))
+;; (define (player-collides?)
+;; (let ((player-hitbox (vehicle-hitbox player-position))
+;; (van-hitbox (vehicle-hitbox red-van-position)))
+;; (rect-intersects? player-hitbox van-hitbox)))
+
(define (player-collides?)
- (let ((player-hitbox (vehicle-hitbox player-position))
- (van-hitbox (vehicle-hitbox red-van-position)))
- (rect-intersects? player-hitbox van-hitbox)))
+ #f)
;;;; Chickadee hooks
@@ -139,12 +161,26 @@
(set! player-position (vec2+ player-position player-velocity))
- (set! red-van-speed (- player-speed red-van-initial-speed))
- (set! red-van-position (vec2- red-van-position (vec2 (* red-van-speed) 0)))
+ (for-each (lambda (veh)
+ (if (vehicle-active? veh)
+ (let ((speed-diff (- player-speed (vehicle-speed veh))))
+ (set-vehicle-position! veh
+ (vec2+ (vehicle-position veh)
+ (vec2 (* speed-diff -1) 0))))))
+ vehicles)
;; when van goes off screen
- (if (>= (* vehicle-length -1) (vec2-x red-van-position))
- (set! red-van-position (calculate-red-van-position 3))))))
+ (for-each
+ (lambda (veh)
+ (if (>= (* vehicle-length -1) (vec2-x (vehicle-position veh)))
+ (begin
+ (set-vehicle-position! veh (calculate-vehicle-position
+ (+ 1 (random road-num-lanes))))
+ (set-vehicle-active! veh #f))
+ (if (and (not (vehicle-active? veh)) (= 0 (random 200)))
+ (set-vehicle-active! veh #t))))
+ vehicles))))
+
(define (draw alpha)
(draw-road road-section-position road-start-y road-num-lanes)
@@ -156,8 +192,11 @@
(draw-sprite player-car player-position #:rotation player-rotation)
- (draw-sprite red-van red-van-position)
-
+ (for-each (lambda (veh)
+ (if (vehicle-active? veh)
+ (draw-sprite (vehicle-sprite veh) (vehicle-position veh))))
+ vehicles)
+
(if game-over
(draw-text "GAME OVER" (vec2 260 (/ (window-width (current-window)) 2)))))