diff options
author | Gene Pasquet <dev@etenil.net> | 2024-05-19 16:59:16 +0100 |
---|---|---|
committer | Gene Pasquet <dev@etenil.net> | 2024-05-19 16:59:16 +0100 |
commit | 282af05d0c7980fdc25f7619129025647c55f04a (patch) | |
tree | febcd27fb62dda66779b83fc561d3f071f225aac | |
parent | ec65a1ad4d0e4aa020511bcfc45c6741be7d4302 (diff) |
Randomly add other vehicles
-rw-r--r-- | TODO.org | 7 | ||||
-rw-r--r-- | turbo.scm | 81 |
2 files changed, 64 insertions, 24 deletions
@@ -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 @@ -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))))) |