main #2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user