small racing game im working on
Diffstat (limited to 'race.gd')
| -rw-r--r-- | race.gd | 69 |
1 files changed, 47 insertions, 22 deletions
@@ -7,8 +7,8 @@ var track_loader_scene: PackedScene var ghost_scene: PackedScene var track_res: TrackResource var track: TrackLoader -var data: TrackSaveableData -var best_time_data: TrackSaveableData +var data: GhostData +var best_time_data: GhostData var car: Car var ghost: GhostCar var start_frame: int @@ -18,13 +18,14 @@ var playing := false var timer := GameTimer.new() const SaveLoad := preload("res://addons/@bendn/remap/private/SaveLoadUtils.gd") -const saves := "user://%s.trackdata" +const saves := "user://%s.ghost" signal next_lap signal created_car(car: Car) signal created_ghost(ghost: GhostCar) signal finished signal split(time: float, prev_time: float) +signal reset func _init(t: TrackResource, _car_scene, _ghost_scene, _track_loader_scene) -> void: car_scene = _car_scene @@ -37,40 +38,64 @@ func mkghost() -> void: g.set_script(load("res://classes/ghost.gd")) ghost = g add_child(ghost) - ghost.global_position = best_time_data.loadshot(0)[0] - ghost.global_rotation = best_time_data.loadshot(0)[1] - ghost.hide() + reset_ghost() created_ghost.emit(ghost) +func reset_ghost() -> void: + if best_time_data: + ghost.global_position = best_time_data.load_snap(0)[0] + ghost.global_rotation = best_time_data.load_snap(0)[1] + ghost.hide() + +func reset_car() -> void: + await get_tree().physics_frame + car.rotation = track.start_rot + Vector3(0, PI, -PI/2) + car.global_position = track.start_pos + Vector3(0, 2, 0) - (car.global_transform.basis.z * 2) # bump forward a teensy bit + car.engine_force = 0 + car.current_gear = 0 + car.linear_velocity = Vector3.ZERO + car.angular_velocity = Vector3.ZERO + car.steering = 0 + for p in car.particles: + p.emitting = false + car.reset() + func mkcar() -> void: car = HumanCar.attach(car_scene) - car.visible = false add_child(car) - car.rotation = track.start_rot + Vector3(0, PI, -PI/2) - car.global_position = track.start_pos + Vector3(0, 2, 0) - (car.global_transform.basis.z * 2) # bump forward a teensy bit - car.visible = true + reset_car() created_car.emit(car) - print("car created") func _ready() -> void: set_physics_process(false) track = track_loader_scene.instantiate() track.track = track_res add_child(track) - data = TrackSaveableData.new(track_res.checkpoints.size(), track_res.laps) - best_time_data = TrackSaveableData._load(saves % track_res.name) + data = GhostData.new(track_res.checkpoints.size(), track_res.laps) + best_time_data = GhostData._load(saves % track_res.name) mkcar() - if best_time_data: - mkghost() + mkghost() connect_checkpoints() add_child(timer) +func _input(event: InputEvent) -> void: + if event.is_action("reset") and playing: + playing = false + if best_time_data: + if ghost: + reset_ghost() + await reset_car() + set_physics_process(false) + data.clear() + timer.reset() + reset.emit() + func connect_checkpoints() -> void: for i in len(track.checkpoints): track.checkpoints[i].collected.connect(passed_cp.bind(i)) track.finish.collected.connect(passed_finish) -func passed_cp(cp: int) -> void: if playing and data.checkpoints[current_lap][cp] < 0: collect(cp) +func passed_cp(cp: int) -> void: if playing and !data.has_collected(current_lap, cp): collect(cp) func passed_finish() -> void: if !playing: return @@ -92,13 +117,13 @@ func passed_finish() -> void: func _physics_process(_delta: float) -> void: data.snapshot(car) - if ghost: - if best_time_data.snaps() - 1 < Engine.get_physics_frames() - start_frame: - print("ran out of snaps, removing ghost") - ghost.queue_free() - ghost = null + if best_time_data: + if best_time_data.snaps - 1 < Engine.get_physics_frames() - start_frame: + if ghost.visible: + print("ran out of snaps, hiding ghost") + ghost.hide() return - var shot := best_time_data.loadshot(Engine.get_physics_frames() - start_frame) + var shot := best_time_data.load_snap(Engine.get_physics_frames() - start_frame) ghost.update(shot[0], shot[1], shot[2]) ghost.visible = (ghost.global_position.distance_squared_to(car.global_position) > 10) |