small racing game im working on
Diffstat (limited to 'race.gd')
-rw-r--r--race.gd56
1 files changed, 39 insertions, 17 deletions
diff --git a/race.gd b/race.gd
index bae0000..d7750a2 100644
--- a/race.gd
+++ b/race.gd
@@ -1,36 +1,58 @@
extends Node3D
-@export var car: PackedScene
+@export var car_scene: PackedScene
@export var track: TrackLoader
@export var splits: Control
@export var timer: Control
+@onready var data := TrackSaveableData.new(track.checkpoints.size())
+@onready var best_time_data := TrackSaveableData._load(saves % track.track.name)
+var car: Node3D
+var start_frame: int
+
+const SaveLoad := preload("res://addons/@bendn/remap/private/SaveLoadUtils.gd")
+const saves := "user://%s.trackdata"
signal created_car(car: Car)
+signal finished
func _ready() -> void:
- var c: Node3D = car.instantiate()
- c.set_script(load("res://classes/human_car.gd"))
- c.show_debug = true
- add_child(c)
- c.ball.freeze = true
- c.visible = false
- c.global_position = track.start_pos + Vector3.UP * 3.5
- c.set_deferred(&"rotation", track.start_rot + Vector3.UP * PI)
+ car = car_scene.instantiate()
+ car.set_script(load("res://classes/human_car.gd"))
+ add_child(car)
+ car.ball.freeze = true
+ car.visible = false
+ car.global_position = track.start_pos + Vector3.UP * 3.5
+ car.set_deferred(&"rotation", track.start_rot + Vector3.UP * PI)
await get_tree().process_frame
- c.global_position = c.global_position - (c.ball.global_transform.basis.z * 2) # bump forward a teensy bit
- c.visible = true
- created_car.emit(c)
+ car.global_position = car.global_position - (car.ball.global_transform.basis.z * 2) # bump forward a teensy bit
+ car.visible = true
+ created_car.emit(car)
for i in len(track.checkpoints):
track.checkpoints[i].collected.connect(collect.bind(i))
track.finish.collected.connect(
func passed_finish() -> void:
- if track.checkpoints.size() == len(collected_checkpoints):
- collect(-1)
+ for t in data.checkpoints: # no any() function on packedfloat32
+ if t < 0:
+ return
+ collect(-1)
+ finished.emit()
+ if not best_time_data or data.time < best_time_data.time:
+ SaveLoad.save(saves % track.track.name, data.data())
+ best_time_data = data
+ data = TrackSaveableData.new(track.checkpoints.size())
)
+func _physics_process(_delta: float) -> void:
+ data.snapshot(car.car_mesh)
+
+
func collect(cp: int) -> void:
- splits.update(timer.elapsed_time, 10)
- collected_checkpoints.append(cp)
+ var time := best_time_data.checkpoints[cp] if best_time_data else -1.0
+ time = best_time_data.time if cp == -1 and time != -1.0 else time
+ splits.update(timer.now(), time)
+ data.collect(cp, timer.now())
+
-var collected_checkpoints: PackedInt32Array = []
+func _on_intro_camera_race_started() -> void:
+ start_frame = Engine.get_physics_frames()