From 7241f30094c180c1d36fda8db932cf31f2691280 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Sun, 16 Mar 2025 20:37:13 +0100 Subject: [PATCH] hit sounds and general sound effects sys --- assets/sfx/hit/hit_00.ogg | Bin 0 -> 7214 bytes assets/sfx/hit/hit_01.ogg | Bin 0 -> 8491 bytes assets/sfx/hit/hit_02.ogg | Bin 0 -> 7237 bytes src/cash.rs | 5 ++-- src/gates.rs | 20 +++++----------- src/keys.rs | 11 ++++----- src/main.rs | 2 ++ src/npc.rs | 4 +++- src/shooting.rs | 14 +++--------- src/sounds.rs | 47 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 68 insertions(+), 35 deletions(-) create mode 100644 assets/sfx/hit/hit_00.ogg create mode 100644 assets/sfx/hit/hit_01.ogg create mode 100644 assets/sfx/hit/hit_02.ogg create mode 100644 src/sounds.rs diff --git a/assets/sfx/hit/hit_00.ogg b/assets/sfx/hit/hit_00.ogg new file mode 100644 index 0000000000000000000000000000000000000000..21fd37ac92e0c7ae11b9ee1c98646e6a739b8a00 GIT binary patch literal 7214 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 R^T!uU6iD5OGiXlBe*voEObq}4 literal 0 HcmV?d00001 diff --git a/assets/sfx/hit/hit_02.ogg b/assets/sfx/hit/hit_02.ogg new file mode 100644 index 0000000000000000000000000000000000000000..329f1fe050955a71515fade329f86faad581b027 GIT binary patch literal 7237 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 G;J*N|&+n4} literal 0 HcmV?d00001 diff --git a/src/cash.rs b/src/cash.rs index b7356b4..ac52750 100644 --- a/src/cash.rs +++ b/src/cash.rs @@ -1,5 +1,7 @@ use bevy::prelude::*; +use crate::sounds::PlaySound; + #[derive(Component, Reflect, Default)] #[reflect(Component)] #[require(Transform)] @@ -28,9 +30,8 @@ fn on_collect( _trigger: Trigger, mut commands: Commands, mut cash: ResMut, - asset_server: Res, ) { - commands.spawn(AudioPlayer::new(asset_server.load("sfx/effects/cash.ogg"))); + commands.trigger(PlaySound::CashCollect); cash.cash += 100; } diff --git a/src/gates.rs b/src/gates.rs index 3c15838..f90f1ee 100644 --- a/src/gates.rs +++ b/src/gates.rs @@ -1,42 +1,34 @@ -use crate::{cutscene::StartCutscene, keys::KeyCollected, movables::TriggerMovableEvent}; +use crate::{ + cutscene::StartCutscene, keys::KeyCollected, movables::TriggerMovableEvent, sounds::PlaySound, +}; use bevy::{prelude::*, utils::hashbrown::HashSet}; pub fn plugin(app: &mut App) { app.add_observer(on_key); } -fn on_key(trigger: Trigger, mut commands: Commands, asset_server: Res) { +fn on_key(trigger: Trigger, mut commands: Commands) { match trigger.event().0.as_str() { "fence_gate" => { commands.trigger(StartCutscene("fence_01".to_string())); - //TODO: put into a sound effects system - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/gate.ogg")), - PlaybackSettings::DESPAWN, - )); - let entities: HashSet<_> = vec!["fence_01", "fence_02"] .into_iter() .map(|s| String::from(s)) .collect(); + commands.trigger(PlaySound::Gate); commands.trigger(TriggerMovableEvent(entities)); } "fence_shaft" => { commands.trigger(StartCutscene("cutscene_02".to_string())); - //TODO: put into a sound effects system - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/gate.ogg")), - PlaybackSettings::DESPAWN, - )); - let entities: HashSet<_> = vec!["fence_shaft"] .into_iter() .map(|s| String::from(s)) .collect(); + commands.trigger(PlaySound::Gate); commands.trigger(TriggerMovableEvent(entities)); } _ => { diff --git a/src/keys.rs b/src/keys.rs index 5ecc9c5..06492c2 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,4 +1,6 @@ -use crate::{billboards::Billboard, player::Player, squish_animation::SquishAnimation}; +use crate::{ + billboards::Billboard, player::Player, sounds::PlaySound, squish_animation::SquishAnimation, +}; use avian3d::prelude::*; use bevy::prelude::*; use std::f32::consts::PI; @@ -46,7 +48,6 @@ fn collect_key( mut collision_event_reader: EventReader, query_player: Query<&Player>, query_collectable: Query<&Key>, - asset_server: Res, ) { for CollisionStarted(e1, e2) in collision_event_reader.read() { let collectable = if query_player.contains(*e1) && query_collectable.contains(*e2) { @@ -59,11 +60,7 @@ fn collect_key( let key = query_collectable.get(collectable).unwrap(); - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/key_collect.ogg")), - PlaybackSettings::DESPAWN, - )); - + commands.trigger(PlaySound::KeyCollect); commands.trigger(KeyCollected(key.0.clone())); commands.entity(collectable).despawn_recursive(); } diff --git a/src/main.rs b/src/main.rs index 3e89bf6..23b2549 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ mod npc; mod platforms; mod player; mod shooting; +mod sounds; mod squish_animation; mod tb_entities; @@ -89,6 +90,7 @@ fn main() { app.add_plugins(squish_animation::plugin); app.add_plugins(cutscene::plugin); app.add_plugins(controls::plugin); + app.add_plugins(sounds::plugin); app.insert_resource(AmbientLight { color: Color::WHITE, diff --git a/src/npc.rs b/src/npc.rs index 8ad48eb..82d2218 100644 --- a/src/npc.rs +++ b/src/npc.rs @@ -1,4 +1,4 @@ -use crate::{keys::KeySpawn, tb_entities::EnemySpawn}; +use crate::{keys::KeySpawn, sounds::PlaySound, tb_entities::EnemySpawn}; use bevy::prelude::*; #[derive(Event, Reflect)] @@ -30,6 +30,8 @@ fn on_hit( return; }; + commands.trigger(PlaySound::Hit); + hp.0 = hp.0.saturating_sub(*damage as i32); info!("npc hp changed: {} [{}]", hp.0, trigger.entity()); diff --git a/src/shooting.rs b/src/shooting.rs index d92f404..a2c2dea 100644 --- a/src/shooting.rs +++ b/src/shooting.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; -use crate::{aim::AimState, npc::Hit}; +use crate::{aim::AimState, npc::Hit, sounds::PlaySound}; #[derive(Event, Reflect)] pub enum TriggerState { @@ -12,17 +12,9 @@ pub fn plugin(app: &mut App) { app.add_observer(on_trigger_state); } -fn on_trigger_state( - trigger: Trigger, - mut commands: Commands, - asset_server: Res, - aim: Res, -) { +fn on_trigger_state(trigger: Trigger, mut commands: Commands, aim: Res) { if matches!(trigger.event(), TriggerState::Active) { - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/abilities/gun.ogg")), - PlaybackSettings::DESPAWN, - )); + commands.trigger(PlaySound::Gun); if let Some(target) = aim.target { commands.entity(target).trigger(Hit { damage: 20 }); diff --git a/src/sounds.rs b/src/sounds.rs new file mode 100644 index 0000000..3e1841c --- /dev/null +++ b/src/sounds.rs @@ -0,0 +1,47 @@ +use bevy::prelude::*; + +#[derive(Event, Copy, Clone, Debug)] +pub enum PlaySound { + Hit, + KeyCollect, + Gun, + Gate, + CashCollect, +} + +pub fn plugin(app: &mut App) { + app.add_observer(spawn_sounds); +} + +fn spawn_sounds( + trigger: Trigger, + mut commands: Commands, + // sound_res: Res, + // settings: SettingsRead, + asset_server: Res, +) { + let event = trigger.event(); + + // if !settings.is_sound_on() { + // continue; + // } + + let source = match event { + PlaySound::Hit => { + let version = rand::random::() % 3; + asset_server.load(format!("sfx/hit/hit_0{version}.ogg")) + } + PlaySound::KeyCollect => asset_server.load("sfx/effects/key_collect.ogg"), + PlaySound::Gun => asset_server.load("sfx/abilities/gun.ogg"), + PlaySound::Gate => asset_server.load("sfx/effects/gate.ogg"), + PlaySound::CashCollect => asset_server.load("sfx/effects/cash.ogg"), + }; + + commands.spawn(( + AudioPlayer::new(source), + PlaybackSettings { + mode: bevy::audio::PlaybackMode::Despawn, + ..Default::default() + }, + )); +}