From b60ab2e74f56a05919688a659cf999b7ca1d200e Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Thu, 3 Apr 2025 12:49:53 -0600 Subject: [PATCH] Spray sfx is pitch-shifted based on relative angle to player --- src/equipment/beam_sfx/spray_sfx.gd | 11 +++++++++++ src/equipment/point_spray/point_spray.gd | 1 + src/equipment/wide_spray/wide_spray.gd | 1 + vault/assets/asset credits.md | 8 +++++++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/equipment/beam_sfx/spray_sfx.gd b/src/equipment/beam_sfx/spray_sfx.gd index b9d096e..253c36f 100644 --- a/src/equipment/beam_sfx/spray_sfx.gd +++ b/src/equipment/beam_sfx/spray_sfx.gd @@ -1,6 +1,9 @@ class_name SpraySFX extends AudioStreamPlayer3D ## Plays only as long as `activate` is called every frame. +@export var base_pitch := 1.0 +@export var pitch_shape_scale := 0.5 + var _active_this_frame := false @@ -8,6 +11,14 @@ func activate() -> void: _active_this_frame = true +func set_angle_from_normal(normal: Vector3) -> void: + var to_player := Player.instance.global_position - global_position + var angle_to_player := normal.angle_to(to_player) + + # linear pitch shape + pitch_scale = base_pitch - (2 * angle_to_player / PI) * pitch_shape_scale + + func _process(_delta: float) -> void: if _active_this_frame: if not playing: diff --git a/src/equipment/point_spray/point_spray.gd b/src/equipment/point_spray/point_spray.gd index ffa3135..3d55fa3 100644 --- a/src/equipment/point_spray/point_spray.gd +++ b/src/equipment/point_spray/point_spray.gd @@ -11,6 +11,7 @@ class_name PointSpray extends Spray func _spray() -> void: if laser.is_colliding(): spray_sfx.activate() + spray_sfx.set_angle_from_normal(laser.get_collision_normal()) var collider := laser.get_collider() if collider is GunkBody: diff --git a/src/equipment/wide_spray/wide_spray.gd b/src/equipment/wide_spray/wide_spray.gd index ce3f141..210c10c 100644 --- a/src/equipment/wide_spray/wide_spray.gd +++ b/src/equipment/wide_spray/wide_spray.gd @@ -43,6 +43,7 @@ func _spray() -> void: for laser: LaserCast in spray_casts.get_children(): if laser.is_colliding(): spray_sfx.activate() + spray_sfx.set_angle_from_normal(laser.get_collision_normal()) var collider := laser.get_collider() if collider is GunkBody: diff --git a/vault/assets/asset credits.md b/vault/assets/asset credits.md index 1790a4a..9e1b5b7 100644 --- a/vault/assets/asset credits.md +++ b/vault/assets/asset credits.md @@ -97,4 +97,10 @@ - author: zolopher - CC0 - retrieved from https://freesound.org/people/zolopher/sounds/44203/ - - assets/sfx/grunk/splat*.wav \ No newline at end of file + - assets/sfx/grunk/splat*.wav + - "shower.mp3" + - author: geodylabs + - CC BY 4.0 + - retrieved from https://freesound.org/people/geodylabs/sounds/122810/ + - assets/sfx/tools/spray.wav + - modified \ No newline at end of file