small racing game im working on
-rw-r--r--assets/cars/kenney_sedan/sedan.tscn7
-rw-r--r--classes/car.gd16
-rw-r--r--scenes/trail.gd11
-rw-r--r--scenes/trail.tscn28
4 files changed, 59 insertions, 3 deletions
diff --git a/assets/cars/kenney_sedan/sedan.tscn b/assets/cars/kenney_sedan/sedan.tscn
index cbb5616..e37ec1a 100644
--- a/assets/cars/kenney_sedan/sedan.tscn
+++ b/assets/cars/kenney_sedan/sedan.tscn
@@ -368,7 +368,7 @@ transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 1.2, 0
use_as_traction = true
wheel_radius = 0.7
wheel_rest_length = 0.4
-wheel_friction_slip = 1.9
+wheel_friction_slip = 1.5
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -388,7 +388,7 @@ transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -1.2,
use_as_traction = true
wheel_radius = 0.7
wheel_rest_length = 0.4
-wheel_friction_slip = 1.9
+wheel_friction_slip = 1.5
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -402,6 +402,9 @@ skeleton = NodePath("")
[node name="particles" parent="bl" instance=ExtResource("4_axi2x")]
+[node name="Node3D" type="Node3D" parent="bl"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.661287, 0)
+
[node name="fl" type="VehicleWheel3D" parent="."]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -1.2, 0.8, -1.51)
use_as_steering = true
diff --git a/classes/car.gd b/classes/car.gd
index e9acc26..9a8b8c0 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -6,6 +6,7 @@ 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
@@ -26,6 +27,8 @@ 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 skids: Array[Array]
+
func ratio() -> float:
match current_gear:
@@ -49,6 +52,7 @@ func reset() -> void:
func _ready() -> void:
for whl in wheels:
particles.append(whl.get_node(^"particles"))
+ skids.append([{active = false}]) # performance and complexity hack
randomize()
func kph():
@@ -117,9 +121,19 @@ func _physics_process(delta: float):
limit(delta)
for i in 4:
- particles[i].emitting = wheels[i].get_skidinfo() < .5
+ particles[i].emitting = wheels[i].get_skidinfo() < (.2 if i > 2 else .8) and wheels[i].is_in_contact() and kph() > 30
if particles[i].emitting:
particles[i].amount = ceil(100 * (1 - wheels[i].get_skidinfo()))
+ 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))
+ if not init and Engine.get_physics_frames() % 4 == 0:
+ (skids[i][-1] as Trail3D).add(wheels[i].global_position - Vector3(0, .661, 0))
+ elif skids[i][-1].active:
+ skids[i][-1].active = false
func start() -> void:
brake = 0
diff --git a/scenes/trail.gd b/scenes/trail.gd
new file mode 100644
index 0000000..3b098e2
--- /dev/null
+++ b/scenes/trail.gd
@@ -0,0 +1,11 @@
+extends Path3D
+class_name Trail3D
+
+@export var active: bool = true
+
+func add(p: Vector3) -> void:
+ curve.add_point(p)
+
+func _ready() -> void:
+ curve = Curve3D.new()
+ curve.bake_interval = 2
diff --git a/scenes/trail.tscn b/scenes/trail.tscn
new file mode 100644
index 0000000..afd68c6
--- /dev/null
+++ b/scenes/trail.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=3 format=3 uid="uid://1ubjbdg0envl"]
+
+[ext_resource type="Script" path="res://scenes/trail.gd" id="1_xpxgt"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qgr6r"]
+transparency = 1
+cull_mode = 1
+shading_mode = 0
+albedo_color = Color(0.188235, 0.188235, 0.188235, 0.517647)
+disable_receive_shadows = true
+
+[node name="trail" type="Path3D"]
+top_level = true
+script = ExtResource("1_xpxgt")
+
+[node name="trail" type="CSGPolygon3D" parent="."]
+polygon = PackedVector2Array(0, 0, 0, 0, 0.5, 0, 0.5, 0)
+mode = 2
+path_node = NodePath("..")
+path_interval_type = 0
+path_interval = 1.0
+path_simplify_angle = 0.2
+path_rotation = 2
+path_local = false
+path_continuous_u = true
+path_u_distance = 1.0
+path_joined = false
+material = SubResource("StandardMaterial3D_qgr6r")