hit sounds and general sound effects sys

This commit is contained in:
2025-03-16 20:37:13 +01:00
parent 4fdd15d765
commit 7241f30094
10 changed files with 68 additions and 35 deletions

BIN
assets/sfx/hit/hit_00.ogg Normal file

Binary file not shown.

BIN
assets/sfx/hit/hit_01.ogg Normal file

Binary file not shown.

BIN
assets/sfx/hit/hit_02.ogg Normal file

Binary file not shown.

View File

@@ -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<CashCollectEvent>,
mut commands: Commands,
mut cash: ResMut<CashResource>,
asset_server: Res<AssetServer>,
) {
commands.spawn(AudioPlayer::new(asset_server.load("sfx/effects/cash.ogg")));
commands.trigger(PlaySound::CashCollect);
cash.cash += 100;
}

View File

@@ -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<KeyCollected>, mut commands: Commands, asset_server: Res<AssetServer>) {
fn on_key(trigger: Trigger<KeyCollected>, 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));
}
_ => {

View File

@@ -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<CollisionStarted>,
query_player: Query<&Player>,
query_collectable: Query<&Key>,
asset_server: Res<AssetServer>,
) {
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();
}

View File

@@ -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,

View File

@@ -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());

View File

@@ -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<TriggerState>,
mut commands: Commands,
asset_server: Res<AssetServer>,
aim: Res<AimState>,
) {
fn on_trigger_state(trigger: Trigger<TriggerState>, mut commands: Commands, aim: Res<AimState>) {
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 });

47
src/sounds.rs Normal file
View File

@@ -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<PlaySound>,
mut commands: Commands,
// sound_res: Res<AudioAssets>,
// settings: SettingsRead,
asset_server: Res<AssetServer>,
) {
let event = trigger.event();
// if !settings.is_sound_on() {
// continue;
// }
let source = match event {
PlaySound::Hit => {
let version = rand::random::<u8>() % 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()
},
));
}