Add basic track timing logic

soundtrack
Ensar Sarajčić 2021-11-17 20:10:51 +01:00
parent 0e684050b2
commit 1e40fc8c50
8 changed files with 211 additions and 32 deletions

View File

@ -13,9 +13,15 @@ _global_script_classes=[ {
"class": "TireSmoke",
"language": "GDScript",
"path": "res://vehicles/tire_smoke.gd"
}, {
"base": "Spatial",
"class": "Track",
"language": "GDScript",
"path": "res://scenes/track.gd"
} ]
_global_script_class_icons={
"TireSmoke": ""
"TireSmoke": "",
"Track": ""
}
[application]

View File

@ -1,8 +1,11 @@
[gd_scene load_steps=11 format=2]
[gd_scene load_steps=16 format=2]
[ext_resource path="res://scenes/test_level.gd" type="Script" id=1]
[ext_resource path="res://scenes/menu/pause_menu.tscn" type="PackedScene" id=2]
[ext_resource path="res://icon.png" type="Texture" id=3]
[ext_resource path="res://scenes/track.gd" type="Script" id=4]
[ext_resource path="res://assets/fonts/kenney-future-narrow.ttf" type="DynamicFontData" id=5]
[ext_resource path="res://scenes/trackgui.gd" type="Script" id=6]
[sub_resource type="PlaneMesh" id=1]
@ -12,6 +15,10 @@ albedo_texture = ExtResource( 3 )
[sub_resource type="ConcavePolygonShape" id=3]
data = PoolVector3Array( 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0, -1, 1, 0, -1 )
[sub_resource type="SpatialMaterial" id=9]
flags_transparent = true
albedo_color = Color( 0.0470588, 0.956863, 0.921569, 0.439216 )
[sub_resource type="Curve3D" id=4]
_data = {
"points": PoolVector3Array( 9.79904, 0, 18.6319, -9.79904, 0, -18.6319, -31.895, 0, 7.96057, 0, 0, 0, 0, 0, 0, -57.093, 0, -13.8155, -7.43263, 0, 17.8593, 7.43263, 0, -17.8593, -58.3374, 0, -41.6578, -15.1113, 0, 9.06681, 15.1113, 0, -9.06681, -37.8981, 0, -68.1249, -14.7755, 0, 2.35069, 14.7755, 0, -2.35069, 4.94635, 7.23662, -84.5424, -17.7978, 0, -2.68641, 17.7978, 0, 2.68641, 61.5006, 0, -91.6313, 0.67157, 0, -25.5212, -0.67157, 0, 25.5212, 97.0961, 0, -69.1323, 2.68643, 0, -7.38771, -2.68643, 0, 7.38771, 78.6267, 0, -42.2678, -8.73099, 0, -17.4619, 8.73099, 0, 17.4619, 66.0252, 8.78723, -14.4988, 0, 0, 0, 0, 0, 0, 95.7529, 0, -1.6352, 0, 0, 0, 0, 0, 0, 139.408, 0, 1.05125, -20.1485, 0, -13.7681, 20.1485, 0, 13.7681, 185.413, 0, 3.4019, 0, 0, 0, 0, 0, 0, 201.868, 0, 23.2145, 0.335724, 0, -17.462, -0.335724, 0, 17.462, 210.21, 5.87604, 64.836, 3.97235, -0.0415859, -7.46809, -3.97235, 0.0415859, 7.46809, 201.532, 0, 95.7487, 0, 0, 0, 0, 0, 0, 183.063, 0, 103.472, 14.7754, 0, 11.0815, -14.7754, 0, -11.0815, 157.877, 0, 103.472, -7.25508, 0, 9.91405, 7.25508, 0, -9.91405, 162.578, 0, 79.2942, 8.24519, 0, 4.16077, -8.24519, 0, -4.16077, 159.22, 0, 35.3035, 0, 0, 0, 0, 0, 0, 109.521, 0, 55.4519, 13.9191, 0, -4.46759, -13.9191, 0, 4.46759, 61.5006, 0, 84.6671, 0, 0, 0, 0, 0, 0, 19.5493, 3.78882, 91.2156, 12.2019, 0, 6.94766, -12.2019, 0, -6.94766, -14.7275, 0, 82.6522, 6.66099, 0.313545, 7.53158, -6.66099, -0.313545, -7.53158, -22.7176, 8.46592, 50.9225, 2.76307, 0.531036, 4.97682, -2.76307, -0.531036, -4.97682, -31.895, 0, 7.96057 ),
@ -35,13 +42,19 @@ noise_offset = Vector2( -1, -1 )
albedo_color = Color( 0.4, 0.301961, 0.00784314, 1 )
albedo_texture = SubResource( 6 )
[sub_resource type="DynamicFont" id=8]
size = 36
outline_size = 2
outline_color = Color( 1, 1, 1, 0.317647 )
font_data = ExtResource( 5 )
[node name="Spatial" type="Spatial"]
script = ExtResource( 1 )
[node name="PauseMenu" parent="." instance=ExtResource( 2 )]
[node name="PlayerSpawnLocation" type="Spatial" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -53.0538, 4.97082, -42.7552 )
[node name="PlayerSpawnLocation" type="Position3D" parent="."]
transform = Transform( -0.577573, 0, -0.816339, 0, 1, 0, 0.816339, 0, -0.577573, -28.4356, 7.65286, 30.9025 )
[node name="StaticBody" type="StaticBody" parent="."]
transform = Transform( 99.9785, 0, 0, 0, 99.9785, 0, 0, 0, 99.9785, 0, 0, 0 )
@ -56,12 +69,16 @@ transform = Transform( 6.13726, 0, 0, 0, 6.13726, 0, 0, 0, 6.13726, 0, 0, 0 )
shape = SubResource( 3 )
[node name="Track" type="Spatial" parent="."]
script = ExtResource( 4 )
track_path = NodePath("Path")
debug = true
debug_material = SubResource( 9 )
[node name="Path" type="Path" parent="Track"]
curve = SubResource( 4 )
[node name="Road" type="CSGPolygon" parent="Track/Path"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.194962, 0.721504, -0.0180283 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.381588, 0.85226, -0.386032 )
use_collision = true
invert_faces = true
polygon = PoolVector2Array( -8, 0, 2, 0.1, 8, 0.1, 2, 0 )
@ -91,3 +108,83 @@ path_local = true
path_continuous_u = true
path_u_distance = 1.0
path_joined = true
[node name="Checkpoints" type="Spatial" parent="Track"]
[node name="TrackGUI" type="MarginContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 20.0
margin_top = 20.0
margin_right = -20.0
margin_bottom = -20.0
script = ExtResource( 6 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HBoxContainer" type="HBoxContainer" parent="TrackGUI"]
margin_right = 984.0
margin_bottom = 560.0
[node name="TimeLabel" type="Label" parent="TrackGUI/HBoxContainer"]
margin_right = 289.0
margin_bottom = 41.0
size_flags_horizontal = 3
size_flags_vertical = 0
custom_colors/font_color = Color( 0.482353, 0, 0, 1 )
custom_fonts/font = SubResource( 8 )
text = "Current lap -"
align = 1
valign = 1
[node name="TimeValue" type="Label" parent="TrackGUI/HBoxContainer"]
margin_left = 297.0
margin_right = 489.0
margin_bottom = 41.0
size_flags_horizontal = 3
size_flags_vertical = 0
custom_colors/font_color = Color( 0.482353, 0, 0, 1 )
custom_fonts/font = SubResource( 8 )
text = "12:23.245"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Divider" type="Label" parent="TrackGUI/HBoxContainer"]
margin_left = 497.0
margin_right = 562.0
margin_bottom = 41.0
size_flags_horizontal = 3
size_flags_vertical = 0
custom_colors/font_color = Color( 0.482353, 0, 0, 1 )
custom_fonts/font = SubResource( 8 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="BestTimeLabel" type="Label" parent="TrackGUI/HBoxContainer"]
margin_left = 570.0
margin_right = 784.0
margin_bottom = 41.0
size_flags_horizontal = 3
size_flags_vertical = 0
custom_colors/font_color = Color( 0.482353, 0, 0, 1 )
custom_fonts/font = SubResource( 8 )
text = "Best Lap -"
[node name="BestTimeValue" type="Label" parent="TrackGUI/HBoxContainer"]
margin_left = 792.0
margin_right = 984.0
margin_bottom = 41.0
size_flags_horizontal = 3
size_flags_vertical = 0
custom_colors/font_color = Color( 0.482353, 0, 0, 1 )
custom_fonts/font = SubResource( 8 )
text = "01:23.256"
__meta__ = {
"_edit_use_anchors_": false
}
[connection signal="lap_complete" from="Track" to="TrackGUI" method="_on_lap_complete"]
[connection signal="time_updated" from="Track" to="TrackGUI" method="_on_time_updated"]

72
scenes/track.gd 100644
View File

@ -0,0 +1,72 @@
class_name Track
extends Spatial
signal time_updated(new_time)
signal lap_complete(lap_time)
export (NodePath) var track_path = null
export (int, 10, 50) var checkpoint_count = 20
export (Vector2) var checkpoint_dim = Vector2(20, 15)
export (bool) var debug = false
export (Material) var debug_material = null
onready var checkpoints = $Checkpoints
onready var path: Path = get_node(track_path)
var last_checkpoint = -1
var start_time = 0
var current_time = 0
func _ready() -> void:
start_time = OS.get_ticks_msec()
var length = path.curve.get_baked_length()
var section_size = 1.0 * length / checkpoint_count
var section = 0.0
for _checkpoint_number in range(checkpoint_count):
var new_checkpoint: Area = Area.new()
new_checkpoint.add_child(_build_checkpoint_collision())
new_checkpoint.transform.origin = path.curve.interpolate_baked(section, true)
section += section_size
checkpoints.add_child(new_checkpoint)
if debug:
var mesh = CylinderMesh.new()
mesh.top_radius = checkpoint_dim.y
mesh.bottom_radius = checkpoint_dim.y
mesh.height = checkpoint_dim.x
if debug_material != null:
mesh.material = debug_material
var meshinst = MeshInstance.new()
meshinst.mesh = mesh
new_checkpoint.add_child(meshinst)
new_checkpoint.connect("body_entered", self, "_on_body_entered_area", [ new_checkpoint ])
checkpoints.global_transform.origin = path.global_transform.origin
func _process(delta: float) -> void:
_update_time()
func _on_body_entered_area(body: Node, area: Area) -> void:
if body.get_groups().has("car"):
# We got the correct checkpoint
if last_checkpoint == area.get_index() - 1:
last_checkpoint += 1
if last_checkpoint == checkpoints.get_child_count() - 1:
emit_signal("lap_complete", current_time)
start_time = OS.get_ticks_msec()
_update_time()
last_checkpoint = -1
func _build_checkpoint_collision():
var collision = CollisionShape.new()
var shape = CylinderShape.new()
shape.radius = checkpoint_dim.x
shape.height = checkpoint_dim.y
collision.shape = shape
return collision
func _update_time():
current_time = OS.get_ticks_msec() - start_time
emit_signal("time_updated", current_time)

28
scenes/trackgui.gd 100644
View File

@ -0,0 +1,28 @@
extends MarginContainer
var best_time = -1
onready var time_value = $HBoxContainer/TimeValue
onready var best_time_value = $HBoxContainer/BestTimeValue
func _ready() -> void:
time_value.text = "NaN"
best_time_value.text = "NaN"
func _on_time_updated(new_time: float) -> void:
time_value.text = _format_time(new_time)
func _on_lap_complete(lap_time: float) -> void:
print(lap_time)
if lap_time < best_time or best_time < 0:
best_time = lap_time
best_time_value.text = _format_time(best_time)
func _format_time(time: float) -> String:
var minute = floor(time / 1000.0 / 60.0)
var second = floor((time / 1000.0) - minute * 60)
var millisecond = time - minute * 60 - second * 1000
return "%02d:%02d.%03d" % [minute, second, millisecond]

View File

@ -41,7 +41,7 @@ material = SubResource( 6 )
radial_segments = 4
rings = 3
[node name="beetlecar" instance=ExtResource( 2 )]
[node name="beetlecar" groups=["car"] instance=ExtResource( 2 )]
mass = 140.0
script = ExtResource( 1 )
EXPECTED_MAX_SPEED = 180.0

View File

@ -40,7 +40,7 @@ material = SubResource( 10 )
radial_segments = 4
rings = 3
[node name="buggy" instance=ExtResource( 1 )]
[node name="buggy" groups=["car"] instance=ExtResource( 1 )]
mass = 150.0
script = ExtResource( 3 )
BASE_ENGINE_PITCH = 0.95

View File

@ -1,24 +0,0 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://vehicles/buggy.tscn" type="PackedScene" id=1]
[sub_resource type="CubeMesh" id=1]
[sub_resource type="ConcavePolygonShape" id=2]
data = PoolVector3Array( -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1 )
[node name="buggy" instance=ExtResource( 1 )]
[node name="Camera" type="Camera" parent="." index="7"]
transform = Transform( -0.0903024, 0, -0.995914, 0, 1, 0, 0.995914, 0, -0.0903024, -3.4904, 1.22508, 0 )
[node name="StaticBody" type="StaticBody" parent="." index="8"]
[node name="MeshInstance" type="MeshInstance" parent="StaticBody" index="0"]
transform = Transform( 6.60148, 0, 0, 0, 0.0658818, 0, 0, 0, 6.60148, 0, -0.212286, 0 )
mesh = SubResource( 1 )
material/0 = null
[node name="CollisionShape" type="CollisionShape" parent="StaticBody" index="1"]
transform = Transform( 6.60148, 0, 0, 0, 0.0658818, 0, 0, 0, 6.60148, 0, -0.212286, 0 )
shape = SubResource( 2 )

View File

@ -48,7 +48,7 @@ material = SubResource( 10 )
radial_segments = 4
rings = 3
[node name="bugmobile" instance=ExtResource( 2 )]
[node name="bugmobile" groups=["car"] instance=ExtResource( 2 )]
mass = 600.0
script = ExtResource( 3 )
MAX_ENGINE_FORCE = 400.0