fix
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user