add rain sound

This commit is contained in:
Overside srl
2026-02-24 18:55:34 +01:00
parent 392fd1254f
commit 0ca80ae65b
8 changed files with 95 additions and 28 deletions

View File

@@ -53,7 +53,6 @@ extends Node
@export var effects_enabled: bool = true
var _sky_material: ShaderMaterial
var _post_process_quad: MeshInstance3D
var _moon_direction: Vector3 = Vector3(0.0, -1.0, 0.0)
var _moon_color: Color = Color(0.9, 0.92, 1.0)
var _moon_intensity: float = 0.0

View File

@@ -41,11 +41,9 @@ signal meteor_shower_ended()
var _spawn_timer: float = 0.0
var _next_spawn_time: float = 0.0
var _meteor_timer: float = 0.0
var _meteor_spawn_accumulator: float = 0.0
var _meteor_shower_elapsed: float = 0.0
var _active_stars: Array[Dictionary] = []
var _star_mesh: MeshInstance3D
var _star_material: ShaderMaterial
var _is_night: bool = false
@@ -185,10 +183,10 @@ func _get_random_fall_direction() -> Vector3:
var base_dir := Vector3(-0.5, -0.8, -0.3).normalized()
var variance := deg_to_rad(spawn_direction_variance)
var rotation := Basis(Vector3.UP, randf() * TAU)
rotation = rotation.rotated(Vector3.RIGHT, randf_range(-variance, variance))
var curr_rotation := Basis(Vector3.UP, randf() * TAU)
curr_rotation = curr_rotation.rotated(Vector3.RIGHT, randf_range(-variance, variance))
return (rotation * base_dir).normalized()
return (curr_rotation * base_dir).normalized()
func _create_star_trail(position: Vector3, direction: Vector3, is_meteor: bool = false) -> MeshInstance3D:

View File

@@ -19,6 +19,11 @@ extends Node3D
@export var lightning_color: Color = Color(0.9, 0.9, 1.0)
@export var lightning_flash_duration: float = 0.15
@export_group("Rain Audio")
@export var rain_audio_enabled: bool = true
@export var rain_volume_db_max: float = 0.0
@export var rain_crossfade_threshold: float = 0.5
@export_group("Thunder")
@export var thunder_enabled: bool = true
@export var thunder_min_delay: float = 1.0
@@ -42,6 +47,8 @@ var _lightning_light: DirectionalLight3D
var _thunder_player: AudioStreamPlayer
var _thunder_pending: bool = false
var _thunder_delay_timer: float = 0.0
var _rain_light_player: AudioStreamPlayer
var _rain_hard_player: AudioStreamPlayer
func _ready() -> void:
@@ -49,6 +56,7 @@ func _ready() -> void:
_create_snow_system()
_create_lightning_light()
_create_thunder_player()
_create_rain_audio_players()
func _process(delta: float) -> void:
@@ -67,6 +75,7 @@ func _process(delta: float) -> void:
_process_lightning(delta)
_process_thunder(delta)
_process_rain_audio()
_follow_camera()
@@ -130,6 +139,66 @@ func _create_thunder_player() -> void:
add_child(_thunder_player)
func _create_rain_audio_players() -> void:
_rain_light_player = AudioStreamPlayer.new()
_rain_light_player.name = "RainLightPlayer"
_rain_light_player.volume_db = -80.0
_rain_light_player.bus = "Master"
_rain_light_player.stream = load("res://resources/rain_light.mp3")
add_child(_rain_light_player)
_rain_hard_player = AudioStreamPlayer.new()
_rain_hard_player.name = "RainHardPlayer"
_rain_hard_player.volume_db = -80.0
_rain_hard_player.bus = "Master"
_rain_hard_player.stream = load("res://resources/rain_gentle.mp3")
add_child(_rain_hard_player)
func _process_rain_audio() -> void:
if not rain_audio_enabled:
if _rain_light_player.playing:
_rain_light_player.stop()
if _rain_hard_player.playing:
_rain_hard_player.stop()
return
if _current_rain < 0.01:
if _rain_light_player.playing:
_rain_light_player.stop()
if _rain_hard_player.playing:
_rain_hard_player.stop()
return
# Below threshold: only light rain plays, volume scales linearly 0 → max
# Above threshold: light rain fades out, hard rain fades in
if _current_rain <= rain_crossfade_threshold:
# Light rain: volume from 0 to max based on percentage within the range
var light_vol := _current_rain / rain_crossfade_threshold
_set_rain_player(_rain_light_player, light_vol)
_stop_rain_player(_rain_hard_player)
else:
# Crossfade zone: light fades out, hard fades in
var t := (_current_rain - rain_crossfade_threshold) / (1.0 - rain_crossfade_threshold)
_set_rain_player(_rain_light_player, 1.0 - t)
_set_rain_player(_rain_hard_player, t)
func _set_rain_player(player: AudioStreamPlayer, weight: float) -> void:
if weight < 0.001:
_stop_rain_player(player)
return
if not player.playing:
player.volume_db = -80.0
player.play()
player.volume_db = lerpf(-80.0, rain_volume_db_max, weight)
func _stop_rain_player(player: AudioStreamPlayer) -> void:
if player.playing:
player.stop()
func _create_lightning_light() -> void:
_lightning_light = DirectionalLight3D.new()
_lightning_light.name = "LightningFlash"