small racing game im working on
| -rw-r--r-- | assets/cars/kenney_sedan/sedan.tscn | 7 | ||||
| -rw-r--r-- | classes/car.gd | 16 | ||||
| -rw-r--r-- | scenes/trail.gd | 11 | ||||
| -rw-r--r-- | scenes/trail.tscn | 28 |
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") |