main #2

Merged
f.fabbrizi merged 5 commits from main into Chunk 2026-04-21 16:36:49 +00:00
Showing only changes of commit 464f405091 - Show all commits

View File

@@ -7,7 +7,7 @@ extends Path3D
@export var axes_distance: float = 3.0
@export var rail_distance: float = 1.2
@export var cameras: Node3D
@export_range(0.0, 1.0) var basic_swing: float = 0.5
@export_range(0.0, 1.0) var basic_swing: float = 0.1
@export_group("Rails Bulding")
@export var sleepers_distance: float = 1.0
@@ -37,6 +37,8 @@ var fireworks_colors: Array[Color] = [
var train_instance: Node3D
var train_progress: float = 0.0
var swing_time: float = 0.0
var curve_roll: float = 0.0
var curve_pitch: float = 0.0
var stop_offset: Array[float] = []
var stops_position: Array[Vector3] = []
@@ -211,6 +213,8 @@ func train_move(delta: float) -> void:
if stop_offset.size() > 0: next_stop_index = stop_offset.size() - 1
var center_position = to_global(curve.sample_baked(train_progress, true))
var prog_back = wrapf(train_progress - 2.0, 0.0, total_length)
var back_position = to_global(curve.sample_baked(prog_back, true))
var prog_forward = wrapf(train_progress + 2.0, 0.0, total_length)
var forward_position = to_global(curve.sample_baked(prog_forward, true))
@@ -223,13 +227,28 @@ func train_move(delta: float) -> void:
cameras.global_position = center_position
cameras.global_basis = train_instance.global_basis
if not stop_ongoing:
var real_speed = abs(train_speed * stop_multiply)
swing_time += delta * real_speed * 2.0
var speed_factor = clamp(real_speed / max(speed_max, 0.001), 0.0, 1.0)
var dir_prev = (center_position - back_position).normalized()
var dir_next = (forward_position - center_position).normalized()
var signed_curve = dir_prev.cross(dir_next).y
var curve_amount = clamp(abs(signed_curve) * 8.0, 0.0, 1.0)
curve_roll = lerp(curve_roll, (-signed_curve * 0.08) * speed_factor, delta * 4.0)
curve_pitch = lerp(curve_pitch, curve_amount * 0.012 * speed_factor, delta * 4.0)
if not stop_ongoing:
swing_time += delta * real_speed * (2.0 + curve_amount)
var amplitude_z = 0.006 * basic_swing
var amplitude_x = 0.004 * basic_swing
var curve_sway = sin(swing_time * 1.35) * 0.01 * curve_amount * speed_factor
train_instance.rotation.z += sin(swing_time) * amplitude_z
train_instance.rotation.x += cos(swing_time * 0.8) * amplitude_x
train_instance.rotation.z += curve_roll + curve_sway
train_instance.rotation.x += curve_pitch
else:
train_instance.rotation.z += curve_roll
train_instance.rotation.x += curve_pitch
func _execute_stop(go_forward: bool = true) -> void:
stop_ongoing = true