diff --git a/entities/camera/camera_3d.gd b/entities/camera/camera_3d.gd index 0e3f7b2..cb6b4cb 100644 --- a/entities/camera/camera_3d.gd +++ b/entities/camera/camera_3d.gd @@ -1,14 +1,22 @@ extends Camera3D -@export var camera_preview : SplinePath -@export var follow_point : Node3D +@export var cameraPreview : SplinePath +@export var followPoint : Node3D +@export var previewUi : Control + @export var follow_speed := 10.0 @export var rotation_speed := 8.0 -@export var path_preview_time := 5.0 +@export var total_preview_time := 5.0 +@export var go_to_first_point_time := 2.0 @export var lerp_speed_preview_coeff := 0.1 +@export var lerp_speed_go_to_first_point_coeff := 0.1 var t := 0.0 -@onready var curve_length := camera_preview.curve.get_baked_length() +var is_in_preview := true +@onready var curve_length := cameraPreview.curve.get_baked_length() +@onready var path_preview_time := total_preview_time - go_to_first_point_time + +signal preview_ended func follow_trans(delta : float, trans : Transform3D, speed_coeff := 1.0) -> void: var target_basis = trans.basis @@ -16,13 +24,29 @@ func follow_trans(delta : float, trans : Transform3D, speed_coeff := 1.0) -> voi global_transform.origin = global_transform.origin.lerp(trans.origin, follow_speed * delta * speed_coeff) global_transform.basis = current_basis.slerp(target_basis, rotation_speed * delta * speed_coeff) - +func go_to_first_point(delta): + var trans = cameraPreview.curve.sample_baked_with_rotation(0, true, true) + var global_trans = (cameraPreview.transform*trans).orthonormalized().rotated_local(Vector3.UP, PI) + follow_trans(delta, global_trans, lerp_speed_go_to_first_point_coeff) + +func follow_preview_path(delta): + var pt = t - go_to_first_point_time + var offset = lerpf(0, curve_length, 1-pt/path_preview_time) + var trans = cameraPreview.curve.sample_baked_with_rotation(offset, true, true) + var global_trans = (cameraPreview.transform*trans).orthonormalized().rotated_local(Vector3.UP, PI) + follow_trans(delta, global_trans, lerp_speed_preview_coeff) + func _physics_process(delta: float) -> void: + if is_in_preview && Input.is_action_pressed("skip_intro"): + t = total_preview_time t += delta - if t <= path_preview_time: - var offset = lerpf(0, curve_length, 1-t/path_preview_time) - var trans = camera_preview.curve.sample_baked_with_rotation(offset, true, true) - var global_trans = (camera_preview.transform*trans).orthonormalized().rotated_local(Vector3.UP, PI) - follow_trans(delta, global_trans, lerp_speed_preview_coeff) + if t < go_to_first_point_time: + go_to_first_point(delta) + elif t < total_preview_time: + follow_preview_path(delta) else: - follow_trans(delta, follow_point.global_transform) + follow_trans(delta, followPoint.global_transform) + if is_in_preview: + is_in_preview = false + previewUi.queue_free() + preview_ended.emit() diff --git a/entities/car/car.gd b/entities/car/car.gd index 025f810..d283da9 100644 --- a/entities/car/car.gd +++ b/entities/car/car.gd @@ -8,8 +8,6 @@ class_name Car @export var steer_speed: float = 2.0 @export var base_lateral_friction: float = 5.0 -@export var lateral_velocity_start_drift_threshold: float = 10.0 -@export var lateral_velocity_total_drift_threshold: float = 15.0 @onready var forward_left: RayCast3D = $ForwardLeft @onready var forward_right: RayCast3D = $ForwardRight diff --git a/entities/preview_ui/preview_ui.tscn b/entities/preview_ui/preview_ui.tscn new file mode 100644 index 0000000..d24af86 --- /dev/null +++ b/entities/preview_ui/preview_ui.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=3 uid="uid://b5qovp8ccycse"] + +[ext_resource type="LabelSettings" uid="uid://dyfwkfdm7affw" path="res://fonts/ui_label_set.tres" id="1_3se3j"] + +[node name="PreviewUi" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -113.0 +offset_top = -42.0 +offset_right = 114.0 +offset_bottom = -19.0 +grow_horizontal = 2 +grow_vertical = 0 +text = "Press \"Space\" to skip preview" +label_settings = ExtResource("1_3se3j") diff --git a/entities/startCounter/StartCounter.tscn b/entities/startCounter/StartCounter.tscn new file mode 100644 index 0000000..2ce5baf --- /dev/null +++ b/entities/startCounter/StartCounter.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://d453m6wc7v0e"] + +[ext_resource type="Script" uid="uid://egjk6w4jomvk" path="res://entities/startCounter/start_counter.gd" id="1_gfj77"] +[ext_resource type="LabelSettings" uid="uid://cru5yoau1mluh" path="res://fonts/BigTextLabelSettings.tres" id="2_xvo28"] + +[node name="StartCounter" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_gfj77") + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -11.5 +offset_right = 20.0 +offset_bottom = 11.5 +grow_horizontal = 2 +grow_vertical = 2 +text = "3" +label_settings = ExtResource("2_xvo28") diff --git a/entities/startCounter/start_counter.gd b/entities/startCounter/start_counter.gd new file mode 100644 index 0000000..e67bcff --- /dev/null +++ b/entities/startCounter/start_counter.gd @@ -0,0 +1,24 @@ +extends Control +class_name StartCounter + +@onready var label: Label = $Label +@export var car: Car +@export var timeManager : TimeManager + +var count_down_started := false +var count_down := 3.0 + +func _physics_process(delta: float) -> void: + if !count_down_started: return + if count_down < 0: + car.freeze = false # Activating car + timeManager.process_mode = Node.PROCESS_MODE_INHERIT + queue_free() # Delete counter + count_down -= delta + label.text = str(int(count_down)) + + + +func _on_camera_3d_preview_ended() -> void: + show() + count_down_started = true diff --git a/entities/startCounter/start_counter.gd.uid b/entities/startCounter/start_counter.gd.uid new file mode 100644 index 0000000..8d526dd --- /dev/null +++ b/entities/startCounter/start_counter.gd.uid @@ -0,0 +1 @@ +uid://egjk6w4jomvk diff --git a/entities/timeManager/timeManager.gd b/entities/timeManager/timeManager.gd index 048c894..68a7ecc 100644 --- a/entities/timeManager/timeManager.gd +++ b/entities/timeManager/timeManager.gd @@ -2,10 +2,7 @@ extends Node class_name TimeManager var time := 0.0 -var started := true func _process(delta: float) -> void: - if !started: return - time += delta diff --git a/project.godot b/project.godot index df65c26..ba855fe 100644 --- a/project.godot +++ b/project.godot @@ -61,6 +61,11 @@ pause={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +skip_intro={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} [physics] diff --git a/scenes/levels/level0_template.tscn b/scenes/levels/level0_template.tscn index 6bce2e6..ea6ab60 100644 --- a/scenes/levels/level0_template.tscn +++ b/scenes/levels/level0_template.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=4 uid="uid://c3mood6wrgggw"] +[gd_scene load_steps=28 format=4 uid="uid://c3mood6wrgggw"] [ext_resource type="PhysicsMaterial" uid="uid://xghhl0tserq3" path="res://entities/road/road_phy_mat.tres" id="1_7gsxw"] [ext_resource type="Script" uid="uid://bgt66573ipmub" path="res://entities/road/road.gd" id="2_quo62"] @@ -13,9 +13,11 @@ [ext_resource type="PackedScene" uid="uid://bbl6ouj0ew23c" path="res://entities/gameUI/gameUI.tscn" id="11_ujhos"] [ext_resource type="PackedScene" uid="uid://dlmjehxav11dx" path="res://entities/pauseMenu/pauseMenu.tscn" id="12_rd3p3"] [ext_resource type="PackedScene" uid="uid://n4qqt180m2fo" path="res://entities/winMenu/winMenu.tscn" id="13_kfo6a"] +[ext_resource type="PackedScene" uid="uid://d453m6wc7v0e" path="res://entities/startCounter/StartCounter.tscn" id="14_bbgq5"] [ext_resource type="PackedScene" uid="uid://cu5r7oxtqa2c0" path="res://entities/checkpoint/CheckPointManager.tscn" id="14_p1hka"] [ext_resource type="PackedScene" uid="uid://mkchrw0fla7r" path="res://entities/timeManager/timeManager.tscn" id="15_4u804"] [ext_resource type="PackedScene" uid="uid://6i2l1pc0hcxd" path="res://world_env/directional_light_3d.tscn" id="15_8cdjg"] +[ext_resource type="PackedScene" uid="uid://b5qovp8ccycse" path="res://entities/preview_ui/preview_ui.tscn" id="15_u4oya"] [sub_resource type="Curve3D" id="Curve3D_4u804"] closed = true @@ -107,19 +109,19 @@ shape = SubResource("ConcavePolygonShape3D_5ntmo") unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0846112, 0.37944, -0.427136) physics_material_override = ExtResource("6_yw11j") +freeze = true road_path = NodePath("../Road/Track") base_lateral_friction = 100.0 -lateral_velocity_start_drift_threshold = 100.0 -lateral_velocity_total_drift_threshold = 200.0 [node name="CameraFollowPoint" parent="Car" index="6"] transform = Transform3D(-1, 0, -8.74228e-08, -3.12697e-08, 0.933843, 0.357684, 8.16391e-08, 0.357684, -0.933843, 0, 1.48636, -2.93594) -[node name="Camera3D" type="Camera3D" parent="." node_paths=PackedStringArray("camera_preview", "follow_point")] +[node name="Camera3D" type="Camera3D" parent="." node_paths=PackedStringArray("cameraPreview", "followPoint", "previewUi")] transform = Transform3D(-0.995019, -1.11202e-08, -0.0996845, -0.0423712, 0.905169, 0.422936, 0.0902313, 0.425053, -0.90066, -24.6506, 25.5741, -51.8213) script = ExtResource("7_icp1j") -camera_preview = NodePath("../CameraPreview") -follow_point = NodePath("../Car/CameraFollowPoint") +cameraPreview = NodePath("../CameraPreview") +followPoint = NodePath("../Car/CameraFollowPoint") +previewUi = NodePath("../PreviewUi") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_0wfyh") @@ -150,13 +152,22 @@ checkPointManager = NodePath("../CheckPointManager") visible = false timeManager = NodePath("../TimeManager") +[node name="StartCounter" parent="." node_paths=PackedStringArray("car", "timeManager") instance=ExtResource("14_bbgq5")] +visible = false +car = NodePath("../Car") +timeManager = NodePath("../TimeManager") + +[node name="PreviewUi" parent="." instance=ExtResource("15_u4oya")] + [node name="CheckPointManager" parent="." instance=ExtResource("14_p1hka")] [node name="TimeManager" parent="." instance=ExtResource("15_4u804")] +process_mode = 4 [node name="DirectionalLight3D" parent="." instance=ExtResource("15_8cdjg")] transform = Transform3D(0.903903, -0.229357, 0.361046, 0, 0.844085, 0.53621, -0.427737, -0.484682, 0.762971, 13.1045, 0, -3.82377) +[connection signal="preview_ended" from="Camera3D" to="StartCounter" method="_on_camera_3d_preview_ended"] [connection signal="end_track" from="CheckPointManager" to="WinMenu" method="_on_check_point_manager_end_track"] [editable path="Car"] diff --git a/scenes/levels/level1.tscn b/scenes/levels/level1.tscn index 76f70b5..d6f11d1 100644 --- a/scenes/levels/level1.tscn +++ b/scenes/levels/level1.tscn @@ -135,16 +135,13 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0846112, 0.37944, -0.427136 physics_material_override = ExtResource("6_gnai3") road_path = NodePath("../Road/Track") base_lateral_friction = 100.0 -lateral_velocity_start_drift_threshold = 100.0 -lateral_velocity_total_drift_threshold = 200.0 [node name="CameraFollowPoint" parent="Car" index="6"] transform = Transform3D(-1, 0, -8.74228e-08, -3.12697e-08, 0.933843, 0.357684, 8.16391e-08, 0.357684, -0.933843, 0, 1.48636, -2.93594) -[node name="Camera3D" type="Camera3D" parent="." node_paths=PackedStringArray("follow_point")] +[node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(-0.995019, -1.11202e-08, -0.0996845, -0.0423712, 0.905169, 0.422936, 0.0902313, 0.425053, -0.90066, 0.0940895, 1.90292, -3.12075) script = ExtResource("7_i8kv5") -follow_point = NodePath("../Car/CameraFollowPoint") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_0wfyh")