small racing game im working on
add particles & checkpoint sound
bendn 2023-02-21
parent 3bc9b19 · commit 03e5abc
-rw-r--r--assets/cars/engine.gd2
-rw-r--r--assets/cars/kenney_sedan/sedan.tscn53
-rw-r--r--assets/cars/skid.tres4
-rw-r--r--assets/cars/sphere.tres13
-rw-r--r--assets/mats/skid.tres6
-rw-r--r--assets/sounds/checkpoint.oggbin0 -> 11380 bytes
-rw-r--r--assets/sounds/checkpoint.ogg.import19
-rw-r--r--classes/car.gd18
-rw-r--r--classes/checkpoint.gd2
-rw-r--r--race.gd2
10 files changed, 93 insertions, 26 deletions
diff --git a/assets/cars/engine.gd b/assets/cars/engine.gd
index d9cdf54..f5f0511 100644
--- a/assets/cars/engine.gd
+++ b/assets/cars/engine.gd
@@ -28,8 +28,6 @@ func _process(d: float):
curve_player(0)
for i in 4:
curve_player(i)
- if n > .9:
- players[-1].pitch_scale = (r / 600) + 1
func curve_player(i: int) -> void:
players[i].volume_db = db_curves[i].sample_baked(n) - 50
diff --git a/assets/cars/kenney_sedan/sedan.tscn b/assets/cars/kenney_sedan/sedan.tscn
index 8691913..34c1071 100644
--- a/assets/cars/kenney_sedan/sedan.tscn
+++ b/assets/cars/kenney_sedan/sedan.tscn
@@ -1,8 +1,10 @@
-[gd_scene load_steps=33 format=3 uid="uid://c157wew5y33bo"]
+[gd_scene load_steps=36 format=3 uid="uid://c157wew5y33bo"]
[ext_resource type="Script" path="res://classes/car.gd" id="1_pdccm"]
[ext_resource type="Script" path="res://assets/cars/engine.gd" id="2_rxib8"]
+[ext_resource type="Material" uid="uid://b0t01t5nxdfdp" path="res://assets/cars/skid.tres" id="2_yev8o"]
[ext_resource type="Curve" uid="uid://f1go1j7raaq1" path="res://assets/cars/sounds/idle_db.tres" id="3_gwsff"]
+[ext_resource type="SphereMesh" uid="uid://cd2plk55q0xr7" path="res://assets/cars/sphere.tres" id="3_wncel"]
[ext_resource type="Curve" uid="uid://bq1r63t410ork" path="res://assets/cars/sounds/low_db.tres" id="4_rdkge"]
[ext_resource type="Curve" uid="uid://d15cjufi3m0wg" path="res://assets/cars/sounds/med_db.tres" id="5_7w6r4"]
[ext_resource type="Curve" uid="uid://d0rkqfng2uvkw" path="res://assets/cars/sounds/high_db.tres" id="6_h74co"]
@@ -16,6 +18,7 @@
[ext_resource type="AudioStream" uid="uid://dwbsofhdf1d8i" path="res://assets/sounds/engine/2000.ogg" id="12_lrx8k"]
[ext_resource type="AudioStream" uid="uid://d1q0xhd5ufguo" path="res://assets/sounds/engine/5000.ogg" id="13_d45jk"]
[ext_resource type="AudioStream" uid="uid://d4k65y04x6yxg" path="res://assets/sounds/engine/8000.ogg" id="14_cerxx"]
+[ext_resource type="AudioStream" uid="uid://d3rhrhg8srpdg" path="res://assets/sounds/checkpoint.ogg" id="19_stkh0"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_hs0do"]
friction = 0.71
@@ -366,7 +369,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.8
wheel_rest_length = 0.4
-wheel_friction_slip = 1.0
+wheel_friction_slip = 1.9
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -378,12 +381,20 @@ transform = Transform3D(-2.33967, 0, -2.0454e-07, 0, 2.33967, 0, 2.0454e-07, 0,
mesh = SubResource("ArrayMesh_n2y6h")
skeleton = NodePath("")
+[node name="particles" type="GPUParticles3D" parent="br"]
+emitting = false
+lifetime = 3.0
+explosiveness = 0.1
+randomness = 0.2
+process_material = ExtResource("2_yev8o")
+draw_pass_1 = ExtResource("3_wncel")
+
[node name="bl" 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_traction = true
wheel_radius = 0.8
wheel_rest_length = 0.4
-wheel_friction_slip = 1.0
+wheel_friction_slip = 1.9
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -395,12 +406,20 @@ transform = Transform3D(2.33967, -1.78815e-14, -2.0454e-07, 0, 2.33967, -2.0454e
mesh = SubResource("ArrayMesh_n2y6h")
skeleton = NodePath("")
+[node name="particles" type="GPUParticles3D" parent="bl"]
+emitting = false
+lifetime = 3.0
+explosiveness = 0.1
+randomness = 0.2
+process_material = ExtResource("2_yev8o")
+draw_pass_1 = ExtResource("3_wncel")
+
[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
wheel_radius = 0.8
wheel_rest_length = 0.4
-wheel_friction_slip = 1.0
+wheel_friction_slip = 2.0
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -412,12 +431,20 @@ transform = Transform3D(2.33967, -3.08847e-14, -2.0454e-07, 0, 2.33967, -3.5328e
mesh = SubResource("ArrayMesh_n2y6h")
skeleton = NodePath("")
+[node name="particles" type="GPUParticles3D" parent="fl"]
+emitting = false
+lifetime = 3.0
+explosiveness = 0.1
+randomness = 0.2
+process_material = ExtResource("2_yev8o")
+draw_pass_1 = ExtResource("3_wncel")
+
[node name="fr" 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
wheel_radius = 0.8
wheel_rest_length = 0.4
-wheel_friction_slip = 1.0
+wheel_friction_slip = 2.0
suspension_travel = 0.2
suspension_stiffness = 150.0
suspension_max_force = 18000.0
@@ -429,6 +456,14 @@ transform = Transform3D(-2.33967, 0, -2.0454e-07, 0, 2.33967, 0, 2.0454e-07, 0,
mesh = SubResource("ArrayMesh_n2y6h")
skeleton = NodePath("")
+[node name="particles" type="GPUParticles3D" parent="fr"]
+emitting = false
+lifetime = 3.0
+explosiveness = 0.1
+randomness = 0.2
+process_material = ExtResource("2_yev8o")
+draw_pass_1 = ExtResource("3_wncel")
+
[node name="Coll" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.43328, 0)
shape = SubResource("SphereShape3D_t532n")
@@ -441,19 +476,15 @@ car = NodePath("..")
[node name="idle" type="AudioStreamPlayer" parent="Engine"]
stream = ExtResource("11_ouf2u")
-volume_db = -50.0
[node name="low" type="AudioStreamPlayer" parent="Engine"]
stream = ExtResource("12_lrx8k")
-volume_db = -50.0
[node name="med" type="AudioStreamPlayer" parent="Engine"]
stream = ExtResource("13_d45jk")
-volume_db = -50.0
[node name="high" type="AudioStreamPlayer" parent="Engine"]
stream = ExtResource("14_cerxx")
-volume_db = -50.0
[node name="Gearbox" type="Node3D" parent="."]
script = ExtResource("11_augb2")
@@ -462,4 +493,8 @@ script = ExtResource("11_augb2")
stream = ExtResource("11_rwd1j")
volume_db = -25.0
+[node name="checkpoint" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("19_stkh0")
+volume_db = -10.0
+
[connection signal="shifted" from="." to="Gearbox" method="_on_sedan_shifted"]
diff --git a/assets/cars/skid.tres b/assets/cars/skid.tres
index 8752e5b..b53db73 100644
--- a/assets/cars/skid.tres
+++ b/assets/cars/skid.tres
@@ -12,9 +12,9 @@ curve = SubResource("Curve_114lc")
lifetime_randomness = 0.2
emission_shape = 1
emission_sphere_radius = 1.0
-direction = Vector3(0, 0, 1)
+direction = Vector3(0, 0, -1)
spread = 5.0
-gravity = Vector3(0, 2, 0)
+gravity = Vector3(0, 1, 0)
initial_velocity_min = 2.0
initial_velocity_max = 5.0
scale_min = 0.9
diff --git a/assets/cars/sphere.tres b/assets/cars/sphere.tres
index 26c2256..604c359 100644
--- a/assets/cars/sphere.tres
+++ b/assets/cars/sphere.tres
@@ -1,11 +1,10 @@
[gd_resource type="SphereMesh" load_steps=2 format=3 uid="uid://cd2plk55q0xr7"]
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_efh8s"]
-transparency = 1
-shading_mode = 0
-albedo_color = Color(0.435294, 0.435294, 0.435294, 0.705882)
+[ext_resource type="Material" uid="uid://clxw3lq6vmrrl" path="res://assets/mats/skid.tres" id="1_3lts8"]
[resource]
-material = SubResource("StandardMaterial3D_efh8s")
-radial_segments = 12
-rings = 12
+material = ExtResource("1_3lts8")
+radius = 1.0
+height = 2.0
+radial_segments = 16
+rings = 8
diff --git a/assets/mats/skid.tres b/assets/mats/skid.tres
new file mode 100644
index 0000000..55da1b1
--- /dev/null
+++ b/assets/mats/skid.tres
@@ -0,0 +1,6 @@
+[gd_resource type="StandardMaterial3D" format=3 uid="uid://clxw3lq6vmrrl"]
+
+[resource]
+transparency = 1
+shading_mode = 0
+albedo_color = Color(0.52549, 0.52549, 0.52549, 0.568627)
diff --git a/assets/sounds/checkpoint.ogg b/assets/sounds/checkpoint.ogg
new file mode 100644
index 0000000..a6acb4a
--- /dev/null
+++ b/assets/sounds/checkpoint.ogg
Binary files differ
diff --git a/assets/sounds/checkpoint.ogg.import b/assets/sounds/checkpoint.ogg.import
new file mode 100644
index 0000000..45fd959
--- /dev/null
+++ b/assets/sounds/checkpoint.ogg.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://d3rhrhg8srpdg"
+path="res://.godot/imported/checkpoint.ogg-569d47a17d9b3af43bb5b40e645b4b69.oggvorbisstr"
+
+[deps]
+
+source_file="res://assets/sounds/checkpoint.ogg"
+dest_files=["res://.godot/imported/checkpoint.ogg-569d47a17d9b3af43bb5b40e645b4b69.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/classes/car.gd b/classes/car.gd
index cc0e33b..bdace2c 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -14,12 +14,14 @@ var steer_target := 0.0
@export var gear_shift_time = 0.3
@export var power_curve: Curve = preload("res://assets/cars/kenney_sedan/power_curve.tres")
@onready var body_mesh := $body as MeshInstance3D
+@onready var checkpoint_sound := $checkpoint as AudioStreamPlayer
@onready var wheels: Array[VehicleWheel3D] = [$bl as VehicleWheel3D, $br as VehicleWheel3D, $fl as VehicleWheel3D, $fr as VehicleWheel3D]
+var particles: Array[GPUParticles3D] = []
signal shifted
-var gear_ratios: Array[float] = [ 2.69, 2.01, 1.59, 1.32, 1.13, 1.0 ]
+var gear_ratios: Array[float] = [ 5, 2.01, 1.59, 1.32, 1.13, 1.0 ]
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
@@ -38,6 +40,8 @@ func is_not_on_ground() -> bool:
return wheels.any(func(whl: VehicleWheel3D): return !whl.is_in_contact())
func _ready() -> void:
+ for whl in wheels:
+ particles.append(whl.get_node(^"particles"))
randomize()
brake = 15
set_physics_process(false)
@@ -60,11 +64,11 @@ func steer(to: float) -> void:
steer_target = lerpf(steer_target, to, 10 * get_physics_process_delta_time())
-## virtual (dont return true for more than a frame)
+## virtual
func shift_down() -> bool:
return false
-## virtual (dont return true for more than a frame)
+## virtual
func shift_up() -> bool:
return false
@@ -101,12 +105,16 @@ 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(kph() / 600, 0.0, 1.0)
- steering = -clampf(steer_target, -.5, .5) * steer_speed_factor
+ steering = -clampf(steer_target, -.7, .7)
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)
limit(delta)
+ for i in 4:
+ particles[i].emitting = wheels[i].get_skidinfo() < .5
+ if particles[i].emitting:
+ particles[i].amount = ceil(100 * (1 - wheels[i].get_skidinfo()))
+
func start() -> void:
brake = 0
set_physics_process(true)
diff --git a/classes/checkpoint.gd b/classes/checkpoint.gd
index 9b7d3e4..468f38c 100644
--- a/classes/checkpoint.gd
+++ b/classes/checkpoint.gd
@@ -6,4 +6,4 @@ signal collected
@export var needs_collision := true
func enter() -> void:
- collected.emit() \ No newline at end of file
+ collected.emit()
diff --git a/race.gd b/race.gd
index d2dd4ef..385ab34 100644
--- a/race.gd
+++ b/race.gd
@@ -105,6 +105,8 @@ func _physics_process(_delta: float) -> void:
func collect(cp: int) -> void:
+ if cp != -1:
+ car.checkpoint_sound.play()
var time := best_time_data.get_time(current_lap, cp) if best_time_data else -1.0
time = best_time_data.time if (not track_res.laps or track_res.laps == current_lap + 1) and cp == -1 and time != -1.0 else time
split.emit(timer.now(), time)