small racing game im working on
Diffstat (limited to 'classes/car.gd')
-rw-r--r--classes/car.gd23
1 files changed, 11 insertions, 12 deletions
diff --git a/classes/car.gd b/classes/car.gd
index 40c4e21..cc0e33b 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -6,8 +6,8 @@ class_name Car
var steer_target := 0.0
-@export var MAX_ENGINE_FORCE := 1200.0
-@export var MAX_BRAKE_FORCE := 25.0
+@export var MAX_ENGINE_FORCE := 4000.0
+@export var MAX_BRAKE_FORCE := 35.0
@export var reverse_ratio := -2.5
@export var final_drive_ratio := 3.38
@export var max_engine_rpm := 8000.0
@@ -24,8 +24,6 @@ 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 current_speed_mps := 0.0 # meters
-@onready var last_pos = position
func ratio() -> float:
match current_gear:
@@ -34,10 +32,10 @@ func ratio() -> float:
_: return gear_ratios[current_gear - 1]
func is_on_ground() -> bool:
- return wheels.all(func(whl: VehicleWheel3D): return whl.get_contact_body() != null)
+ return wheels.all(func(whl: VehicleWheel3D): return whl.is_in_contact() != null)
func is_not_on_ground() -> bool:
- return wheels.any(func(whl: VehicleWheel3D): return whl.get_contact_body() == null)
+ return wheels.any(func(whl: VehicleWheel3D): return !whl.is_in_contact())
func _ready() -> void:
randomize()
@@ -45,7 +43,7 @@ func _ready() -> void:
set_physics_process(false)
func kph():
- return current_speed_mps * 3600.0 / 1000.0
+ return (3 * PI * wheels[0].wheel_radius * rpm()) / 25;
# calculate the RPM of our engine based on the average of the wheels
func rpm() -> float:
@@ -91,9 +89,11 @@ func _process_gear_inputs(delta: float):
func _process(delta: float):
_process_gear_inputs(delta)
-func _physics_process(delta: float):
- current_speed_mps = (position - last_pos).length() / delta
+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):
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
@@ -101,12 +101,11 @@ func _physics_process(delta: float):
engine_force = throttle * power_factor * gear_ratios[current_gear - 1] * final_drive_ratio * MAX_ENGINE_FORCE * clutch_position
else:
engine_force = 0.0
- var steer_speed_factor: float = 1 - clampf(current_speed_mps / 150, 0.0, 1.0)
+ var steer_speed_factor: float = 1 - clampf(kph() / 600, 0.0, 1.0)
steering = -clampf(steer_target, -.5, .5) * steer_speed_factor
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)
- # remember where we are
- last_pos = position
+ limit(delta)
func start() -> void:
brake = 0