aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2024-05-23 17:38:19 +0100
committerGene Pasquet <dev@etenil.net>2024-05-23 17:38:19 +0100
commit5f9856cdda5ce1c88494b658425dd50bd53967ca (patch)
treebb655d7841d96b710c7f6f229abd50b2f71b5a11
parentb0168b0c9524fe762a070aa252156c9d650595d3 (diff)
Smooth out acceleration and braking
-rw-r--r--TODO.org4
-rw-r--r--turbo.scm45
2 files changed, 32 insertions, 17 deletions
diff --git a/TODO.org b/TODO.org
index 7f4497a..4a4bbda 100644
--- a/TODO.org
+++ b/TODO.org
@@ -9,7 +9,7 @@
** DONE Detect collision with other vehicles
** DONE Make cars in different lanes drive at different speeds
** DONE Add restart option
-** TODO Smooth acceleration
+** DONE Smooth acceleration
** TODO Smooth increasing turn rate
** TODO Display level on screen
** TODO Add weapon to player car
@@ -19,4 +19,4 @@
** TODO Improve visuals
** TODO Add start menu
** DONE Add music
-** TODO Add sound effects
+** STARTED Add sound effects
diff --git a/turbo.scm b/turbo.scm
index 63ebe0a..4af0b6b 100644
--- a/turbo.scm
+++ b/turbo.scm
@@ -27,9 +27,14 @@
(define vehicles-sprites (load-tileset "vehicles.png" vehicle-length vehicle-height))
(define player-velocity (vec2 0 0))
-(define player-min-speed 4)
-(define player-max-speed 20)
+(define player-min-speed 250)
+(define player-max-speed 2000)
(define player-rotation 0)
+;; 2px/s/s acceleration
+(define player-car-acceleration 100)
+;; 4px/s/s deceleration
+(define player-car-deceleration -500)
+(define player-current-acceleration 0)
(define level-difficulty 1)
@@ -63,7 +68,7 @@
(let ((lane-num (random road-num-lanes)))
(set-vehicle-position! veh (calculate-vehicle-position
(+ 1 lane-num)))
- (set-vehicle-speed! veh (+ player-min-speed lane-num) )
+ (set-vehicle-speed! veh (+ player-min-speed (* 25 lane-num)) )
(set-vehicle-active! veh #f)))
(define vehicles (make-vehicle-list (list) 0))
@@ -165,7 +170,7 @@
(define (vehicle-off-screen? veh)
(and vehicle-active?
- (>= (- 0 vehicle-length) (vec2-x (vehicle-position veh)))))
+ (>= (- vehicle-length) (vec2-x (vehicle-position veh)))))
;;;; Chickadee hooks
@@ -184,6 +189,12 @@
(off-road-player)
(set! game-over #t)))
+ (let ((new-speed (+ (vehicle-speed player-car)
+ (* player-current-acceleration interval))))
+ (set-vehicle-speed! player-car (min player-max-speed
+ (max player-min-speed
+ new-speed))))
+
(if (player-collides?)
(begin
(off-road-player)
@@ -191,14 +202,15 @@
(set! game-over #t)))
(set! road-section-position
- (if (< road-section-position (- 0 lane-length))
- (- (+ road-section-position lane-length) (vehicle-speed player-car))
- (- road-section-position (vehicle-speed player-car))))
+ (if (< road-section-position (- lane-length))
+ (- (+ road-section-position lane-length) (* interval (vehicle-speed player-car)))
+ (- road-section-position (* interval (vehicle-speed player-car)))))
- (set-vehicle-position! player-car (vec2+ (vehicle-position player-car) player-velocity))
+ (set-vehicle-position! player-car (vec2+ (vehicle-position player-car)
+ player-velocity))
(for-each (lambda (veh)
- (vehicle-move! veh (vec2 (- 0 (vehicle-speed- player-car veh)) 0)))
+ (vehicle-move! veh (vec2 (- (* interval (vehicle-speed- player-car veh))) 0)))
(filter vehicle-active? vehicles))
;; Reset vehicles that have gone off screen
@@ -230,8 +242,8 @@
(draw-sprite (vehicle-sprite veh) (vehicle-position veh)))
(filter vehicle-active? vehicles))
- (draw-text (format #f "Speed: ~smph" (* (vehicle-speed player-car) 5))
- (vec2 450.0 20.0)
+ (draw-text (format #f "Speed: ~smph" (round (* (vehicle-speed player-car) 0.11187)))
+ (vec2 400.0 20.0)
#:font the-font
#:scale (vec2 2 2))
@@ -246,11 +258,11 @@
((eq? key 'w)
(set! player-velocity (vec2 0 vehicle-steering-speed)))
((eq? key 's)
- (set! player-velocity (vec2 0 (- 0 vehicle-steering-speed))))
- ((eq? key 'a)
- (set-player-speed! (- (vehicle-speed player-car) 1)))
+ (set! player-velocity (vec2 0 (- vehicle-steering-speed))))
((eq? key 'd)
- (set-player-speed! (+ (vehicle-speed player-car) 1)))
+ (set! player-current-acceleration player-car-acceleration))
+ ((eq? key 'a)
+ (set! player-current-acceleration player-car-deceleration))
((eq? key 'escape)
(abort-game))
((and (eq? key 'return) game-over)
@@ -263,5 +275,8 @@
(set! game-over #f))))
(define (key-release key modifiers)
+ (cond
+ ((or (eq? key 'a) (eq? key 'd))
+ (set! player-current-acceleration 0)))
(if (or (eq? key 'w) (eq? key 's))
(set! player-velocity (vec2 0 0))))