add rain sound
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user