This commit is contained in:
Overside srl
2026-02-16 22:55:10 +01:00
parent dd1ba0fa9a
commit 650000a79e
6 changed files with 146 additions and 2 deletions

View File

@@ -38,6 +38,7 @@ var distance_traveled: float = 0.0
var locomotive: Node3D
var wagons: Array = []
var wagon_distances: Array = []
var _horn_player: AudioStreamPlayer
func _ready() -> void:
@@ -46,6 +47,7 @@ func _ready() -> void:
await get_tree().process_frame
_create_train()
current_speed = base_speed
_create_horn()
func _remove_train():
@@ -144,6 +146,9 @@ func _handle_input(delta: float) -> void:
elif Input.is_action_pressed("change_train"):
_create_train()
current_speed = base_speed
if Input.is_action_just_pressed("horn"):
_play_horn()
func _update_movement(delta: float) -> void:
distance_traveled += current_speed * delta
@@ -187,3 +192,54 @@ func get_locomotive_position() -> Vector3:
func get_speed() -> float:
return current_speed
func _create_horn() -> void:
_horn_player = AudioStreamPlayer.new()
_horn_player.name = "HornPlayer"
_horn_player.volume_db = -6.0
_horn_player.bus = &"Master"
add_child(_horn_player)
var sample_rate := 22050
var duration := 1.8
var num_samples := int(sample_rate * duration)
var audio := AudioStreamWAV.new()
audio.format = AudioStreamWAV.FORMAT_16_BITS
audio.mix_rate = sample_rate
audio.stereo = false
var data := PackedByteArray()
data.resize(num_samples * 2)
var freq1 := 277.0 # C#4
var freq2 := 370.0 # F#4
var freq3 := 311.0 # Eb4
for i in num_samples:
var t := float(i) / sample_rate
var envelope := 1.0
if t < 0.15:
envelope = t / 0.15
elif t > duration - 0.4:
envelope = (duration - t) / 0.4
envelope = clampf(envelope, 0.0, 1.0)
var sample := sin(t * freq1 * TAU) * 0.4
sample += sin(t * freq2 * TAU) * 0.3
sample += sin(t * freq3 * TAU) * 0.2
sample += sin(t * freq1 * 2.0 * TAU) * 0.1
sample *= envelope
var value := clampi(int(sample * 24000.0), -32768, 32767)
data[i * 2] = value & 0xFF
data[i * 2 + 1] = (value >> 8) & 0xFF
audio.data = data
_horn_player.stream = audio
func _play_horn() -> void:
if _horn_player and not _horn_player.playing:
_horn_player.play()