small racing game im working on
Diffstat (limited to 'classes/car.gd')
-rw-r--r--classes/car.gd60
1 files changed, 37 insertions, 23 deletions
diff --git a/classes/car.gd b/classes/car.gd
index 16fd6ea..2128a45 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -6,7 +6,6 @@ class_name Car
var steer_target := 0.0
-const trail_scene = preload("res://scenes/trail.tscn")
@export var MAX_ENGINE_FORCE := 4000.0
@export var MAX_BRAKE_FORCE := 35.0
@export var reverse_ratio := -2.5
@@ -18,6 +17,7 @@ const trail_scene = preload("res://scenes/trail.tscn")
@onready var checkpoint_sound := $checkpoint as AudioStreamPlayer
@onready var wheels: Array[VehicleWheel3D] = [$bl as VehicleWheel3D, $br as VehicleWheel3D, $fl as VehicleWheel3D, $fr as VehicleWheel3D]
+@onready var wheel_radius: float = wheels[0].wheel_radius
var particles: Array[GPUParticles3D] = []
signal shifted
@@ -27,7 +27,13 @@ var current_gear := 0 # -1 reverse, 0 = neutral, 1 - 6 = gear 1 to 6.
var clutch_position := 1 # 0.0 = clutch engaged
var gear_timer := 0.0
var throttle := 0.0
+var engine_rpm := 800.0 # currently cosmetic
+var wheel_rpm := 0.0
+var can_shift := true
+var can_accelerate := false
+
const inactive = {active = false};
+const trail_scene = preload("res://scenes/trail.tscn")
var skids: Array[Array]
func ratio() -> float:
@@ -46,11 +52,14 @@ func is_not_on_ground() -> bool:
return wheels.any(func(whl: VehicleWheel3D): return !whl.is_in_contact())
func reset() -> void:
+ gear_timer = 0
+ clutch_position = 0
steering = 0
throttle = 0
engine_force = 0
- brake = 15
- set_physics_process(false)
+ brake = MAX_BRAKE_FORCE
+ can_shift = true
+ can_accelerate = false
for wheel in skids:
if wheel:
for skid in wheel:
@@ -64,11 +73,11 @@ func _ready() -> void:
particles.append(whl.get_node(^"particles"))
randomize()
-func kph():
- return (3 * PI * wheels[0].wheel_radius * rpm()) / 25;
+func kph() -> float:
+ return (3 * PI * wheel_radius * wheel_rpm) / 25;
-# calculate the RPM of our engine based on the average of the wheels
-func rpm() -> float:
+# calculate the RPM of wheels
+func whl_rpm() -> float:
var sum := 0.0
for wheel in wheels:
sum += abs(wheel.get_rpm())
@@ -80,7 +89,7 @@ func steer(to: float) -> void:
else:
to = -steer_curve.sample_baked(-to) if to < 0.0 else steer_curve.sample_baked(to)
- steer_target = lerpf(steer_target, to, 10 * get_physics_process_delta_time())
+ steer_target = clampf(lerpf(steer_target, to, 10 * get_physics_process_delta_time()), -.7, .7)
## virtual
func shift_down() -> bool:
@@ -109,39 +118,44 @@ func _process_gear_inputs(delta: float):
clutch_position = 1
func _process(delta: float):
- _process_gear_inputs(delta)
+ if can_shift:
+ _process_gear_inputs(delta)
+ steering = -steer_target
+ body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf(((-steering * .2) * linear_velocity.length_squared() / 685.0) + randf_range(-0.05,0.05), -.4, .4), 10 * delta)
+ engine_rpm = move_toward(engine_rpm, (wheel_rpm * engine_force * 0.0015) + 800, 800)
func limit(delta: float) -> void:
linear_damp = max((.5 * delta) * (kph() - 400), 0) if kph() > 400 else 0.0
angular_damp = max(5 * (angular_velocity.length_squared() - 45), 0) if angular_velocity.length_squared() > 45 else 0.0
func _physics_process(delta: float):
- downforce(5)
- var power_factor := power_curve.sample_baked(clampf(rpm() / max_engine_rpm, 0.0, 1.0))
- if current_gear == -1:
- engine_force = throttle * power_factor * reverse_ratio * final_drive_ratio * MAX_ENGINE_FORCE * clutch_position
- elif current_gear > 0 and current_gear <= gear_ratios.size():
- engine_force = throttle * power_factor * gear_ratios[current_gear - 1] * final_drive_ratio * MAX_ENGINE_FORCE * clutch_position
- else:
- engine_force = 0.0
+ if can_accelerate:
+ var power_factor := power_curve.sample_baked(clampf(wheel_rpm / max_engine_rpm, 0.0, 1.0))
+ if current_gear == -1:
+ engine_force = throttle * power_factor * reverse_ratio * final_drive_ratio * MAX_ENGINE_FORCE * clutch_position
+ elif current_gear > 0 and current_gear <= gear_ratios.size():
+ engine_force = throttle * power_factor * gear_ratios[current_gear - 1] * final_drive_ratio * MAX_ENGINE_FORCE * clutch_position
+ else:
+ engine_force = 0.0
+
+ wheel_rpm = whl_rpm()
- steering = -clampf(steer_target, -.7, .7)
- body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf(((-steering * .2) * linear_velocity.length_squared() / 685.0) + randf_range(-0.05,0.05), -.4, .4), 10 * delta)
limit(delta)
+ downforce(5)
for i in 4:
particles[i].emitting = wheels[i].get_skidinfo() < (.2 if i > 2 else .99) and wheels[i].is_in_contact() and kph() > 30
if particles[i].emitting:
+ @warning_ignore("narrowing_conversion")
particles[i].amount = clampf(ceil(150 * (1 - wheels[i].get_skidinfo())) * 1 if i > 2 else 8, 0, 150)
- var init := false
if !skids[i][-1].active:
- init = true
skids[i].append(trail_scene.instantiate() as Trail3D)
get_parent().add_child(skids[i][-1])
(skids[i][-1] as Trail3D).add(wheels[i].global_position - Vector3(0, .661, 0))
elif skids[i][-1].active:
- skids[i][-1].active = false
+ skids[i][-1].active = false
func start() -> void:
brake = 0
- set_physics_process(true)
+ can_shift = true
+ can_accelerate = true