small racing game im working on
Diffstat (limited to 'classes/car.gd')
| -rw-r--r-- | classes/car.gd | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/classes/car.gd b/classes/car.gd index 05085a2..0786a0f 100644 --- a/classes/car.gd +++ b/classes/car.gd @@ -12,12 +12,14 @@ class_name Car @onready var body_mesh := $CarMesh/body as MeshInstance3D @export var show_debug := false -var acceleration := 35.0 # ai must change this for randomness +var acceleration := 45.0 # ai must change this for randomness +const limit_speed := 200.0 +const limit_spin := 35.0 const sphere_offset := Vector3(0, -2.3, 0) const max_steering_range := deg_to_rad(40.0) const turn_speed := 2.0 const wheel_turn_speed := 0.2 -const turn_stop_limit := 0.75 +const turn_stop_limit := 2 const body_tilt := 685.0 var throttle := 0.0 @@ -44,7 +46,7 @@ func move_mesh(delta: float) -> void: ball.apply_central_force(-car_mesh.global_transform.basis.z * throttle) func turn(delta: float) -> void: - if ball.linear_velocity.length() > turn_stop_limit: + if kph() > turn_stop_limit: var new_basis := car_mesh.global_transform.basis.rotated(car_mesh.global_transform.basis.y, _steering) car_mesh.global_transform.basis = car_mesh.global_transform.basis.slerp(new_basis, turn_speed * delta) car_mesh.global_transform = car_mesh.global_transform.orthonormalized() @@ -56,6 +58,18 @@ func floor_mesh(delta: float) -> void: var xform := align_with_y(car_mesh.global_transform, n.normalized()) car_mesh.global_transform = car_mesh.global_transform.interpolate_with(xform, 10 * delta) +# aka arbitrary units/h +func kph() -> float: + return (ball.linear_velocity.length_squared() / 12) + +# angular au/h +func spin_kph() -> float: + return (ball.angular_velocity.length_squared() / 12) + +func limit() -> void: + ball.linear_damp = max(.1 * (kph() - limit_speed), 0) if kph() > limit_speed else 0.0 + ball.angular_damp = max(.1 * (spin_kph() - limit_spin), 0) if spin_kph() > limit_spin else 0.0 + func _physics_process(delta: float) -> void: move_mesh(delta) @@ -67,10 +81,12 @@ func _physics_process(delta: float) -> void: # steering = -steering # drift particles - var drift: bool = ball.linear_velocity.length() > 25 and abs(ball.linear_velocity.normalized().dot(-car_mesh.transform.basis.z)) > .5 + var drift: bool = kph() > 25 and abs(ball.linear_velocity.normalized().dot(-car_mesh.transform.basis.z)) > .5 skid_l.emitting = drift skid_r.emitting = drift + limit() + turn(delta) floor_mesh(delta) |