small racing game im working on
Diffstat (limited to 'classes/car.gd')
-rw-r--r--classes/car.gd58
1 files changed, 43 insertions, 15 deletions
diff --git a/classes/car.gd b/classes/car.gd
index bbb3164..51d0be3 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -38,6 +38,9 @@ const inactive = {active = false};
const trail_scene = preload("res://scenes/trail.tscn")
var skids: Array[Array]
+var shup := false
+var shown := false
+
func ratio() -> float:
match current_gear:
0: return 0
@@ -54,6 +57,7 @@ func is_not_on_ground() -> bool:
return wheels.any(func(whl: VehicleWheel3D): return !whl.is_in_contact())
func reset() -> void:
+ set_collision_mask_value(2, 0)
gear_timer = 0
clutch_position = 0
steering = 0
@@ -79,8 +83,12 @@ func _ready() -> void:
particles.append(whl.get_node(^"particles"))
randomize()
reset()
+ if Globals.playing.night():
+ night()
func kph() -> float:
+ if can_accelerate == false:
+ return 0
return (3 * PI * wheel_radius * wheel_rpm) / 25;
# calculate the RPM of wheels
@@ -111,12 +119,14 @@ func _process_gear_inputs(delta: float):
gear_timer = max(0.0, gear_timer - delta)
clutch_position = 0
else:
- if shift_down() and current_gear > -1:
+ if shown and current_gear > -1:
+ shown = false
current_gear = current_gear - 1
gear_timer = gear_shift_time
clutch_position = 0
shifted.emit()
- elif shift_up() and current_gear < gear_ratios.size():
+ elif shup and current_gear < gear_ratios.size():
+ shup = false
current_gear = current_gear + 1
gear_timer = gear_shift_time
clutch_position = 0
@@ -125,17 +135,17 @@ func _process_gear_inputs(delta: float):
clutch_position = 1
func _process(delta: float):
- if can_shift:
- _process_gear_inputs(delta)
- steering = -steer_target
body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf((-steering * .001 + randf_range(-0.0005,0.0005)) * whl_rpm(), -.3, .3), 2 * delta)
- engine_rpm = clampf(move_toward(engine_rpm, (wheel_rpm * engine_force * 0.0015), 800), 800, MAX_ENGINE_FORCE)
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):
+ steering = steer_target
+ if can_shift:
+ _process_gear_inputs(delta)
+
if can_accelerate:
var power_factor := power_curve.sample_baked(clampf(wheel_rpm / max_engine_rpm, 0.0, 1.0))
if current_gear == -1:
@@ -146,6 +156,7 @@ func _physics_process(delta: float):
engine_force = 0.0
wheel_rpm = whl_rpm()
+ engine_rpm = clampf(move_toward(engine_rpm, (wheel_rpm * engine_force * 0.0015), 800), 800, MAX_ENGINE_FORCE)
limit(delta)
downforce(5)
@@ -166,6 +177,11 @@ func _physics_process(delta: float):
(skids[i][-1] as Trail3D).add(wheels[i].global_position - Vector3(0, .561, 0))
elif skids[i][-1].active:
skids[i][-1].active = false
+
+ if brake > 0:
+ tail.albedo_color = Color.RED;
+ else:
+ tail.albedo_color = Color(1, 0.34902, 0.227451, 1)
func start() -> void:
brake = 0
@@ -173,14 +189,26 @@ func start() -> void:
can_accelerate = true
func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
- if kph() < 100:
- return
var contact := state.get_contact_count()
while contact > 0:
- contact -= 1
- var p := state.get_contact_local_position(contact) # it says local, but its global.
- var direction := state.get_contact_local_normal(contact)
- var sprk := sparks.instantiate()
- (sprk.process_material as ParticleProcessMaterial).direction = direction
- get_parent().add_child(sprk)
- sprk.global_position = p
+ contact -= 1
+ if state.get_contact_local_velocity_at_position(contact).length() < 0.5:
+ continue
+ var p := state.get_contact_local_position(contact)
+ var direction := state.get_contact_local_normal(contact)
+ var sprk: GPUParticles3D = sparks.instantiate()
+ var sprkmat: ParticleProcessMaterial = sprk.process_material
+ sprkmat.direction = direction
+ sprkmat.initial_velocity_min = state.get_contact_local_velocity_at_position(contact).length()/5
+ sprkmat.initial_velocity_max = state.get_contact_local_velocity_at_position(contact).length()/3
+ sprk.amount = clampi(floori(state.get_contact_local_velocity_at_position(contact).length()/4), 0, 20)
+ get_parent().add_child(sprk)
+ sprk.position = p
+
+@onready var tail: Material = $body.mesh.surface_get_material(5);
+@onready var head: Material = $body.mesh.surface_get_material(6);
+
+func night() -> void:
+ $lights.visible = true;
+ tail.emission_enabled = true;
+ head.emission_enabled = true;