reset audio on death/respawn
This commit is contained in:
parent
ea25c7fed3
commit
48476e317f
24
src/audio.rs
24
src/audio.rs
|
@ -20,6 +20,7 @@ impl Plugin for AudioPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_systems(Startup, setup);
|
app.add_systems(Startup, setup);
|
||||||
app.add_systems(Update, toggle_bgm);
|
app.add_systems(Update, toggle_bgm);
|
||||||
|
app.add_systems(Update, respawn_sinks.run_if(on_event::<RespawnSinksEvent>()));
|
||||||
app.add_systems(Update, play_zoom_sfx);
|
app.add_systems(Update, play_zoom_sfx);
|
||||||
app.add_systems(Update, pause_all.run_if(on_event::<PauseAllSfxEvent>()));
|
app.add_systems(Update, pause_all.run_if(on_event::<PauseAllSfxEvent>()));
|
||||||
app.add_systems(PostUpdate, play_sfx);
|
app.add_systems(PostUpdate, play_sfx);
|
||||||
|
@ -27,6 +28,7 @@ impl Plugin for AudioPlugin {
|
||||||
app.add_event::<PlaySfxEvent>();
|
app.add_event::<PlaySfxEvent>();
|
||||||
app.add_event::<PauseAllSfxEvent>();
|
app.add_event::<PauseAllSfxEvent>();
|
||||||
app.add_event::<ToggleMusicEvent>();
|
app.add_event::<ToggleMusicEvent>();
|
||||||
|
app.add_event::<RespawnSinksEvent>();
|
||||||
app.insert_resource(ZoomTimer(
|
app.insert_resource(ZoomTimer(
|
||||||
Timer::from_seconds(0.09, TimerMode::Repeating)));
|
Timer::from_seconds(0.09, TimerMode::Repeating)));
|
||||||
}
|
}
|
||||||
|
@ -94,18 +96,35 @@ pub enum SfxType {
|
||||||
|
|
||||||
#[derive(Event)] pub struct PlaySfxEvent(pub Sfx);
|
#[derive(Event)] pub struct PlaySfxEvent(pub Sfx);
|
||||||
#[derive(Event)] pub struct PauseAllSfxEvent;
|
#[derive(Event)] pub struct PauseAllSfxEvent;
|
||||||
|
#[derive(Event)] pub struct RespawnSinksEvent;
|
||||||
#[derive(Event)] pub struct ToggleMusicEvent();
|
#[derive(Event)] pub struct ToggleMusicEvent();
|
||||||
#[derive(Resource)] pub struct Sounds(HashMap<Sfx, Handle<AudioSource>>);
|
#[derive(Resource)] pub struct Sounds(HashMap<Sfx, Handle<AudioSource>>);
|
||||||
|
|
||||||
pub fn setup(
|
pub fn setup(
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
settings: Res<var::Settings>,
|
|
||||||
asset_server: Res<AssetServer>,
|
asset_server: Res<AssetServer>,
|
||||||
|
mut ew_respawnsinks: EventWriter<RespawnSinksEvent>,
|
||||||
) {
|
) {
|
||||||
let mut map = HashMap::new();
|
let mut map = HashMap::new();
|
||||||
for (sfxtype, sfx, path) in PATHS {
|
for (_, sfx, path) in PATHS {
|
||||||
let source = asset_server.load(*path);
|
let source = asset_server.load(*path);
|
||||||
map.insert(*sfx, source.clone());
|
map.insert(*sfx, source.clone());
|
||||||
|
}
|
||||||
|
commands.insert_resource(Sounds(map));
|
||||||
|
ew_respawnsinks.send(RespawnSinksEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn respawn_sinks(
|
||||||
|
mut commands: Commands,
|
||||||
|
asset_server: Res<AssetServer>,
|
||||||
|
settings: Res<var::Settings>,
|
||||||
|
q_audiosinks: Query<Entity, (With<AudioSink>, With<Sfx>)>,
|
||||||
|
) {
|
||||||
|
for sink in &q_audiosinks {
|
||||||
|
commands.entity(sink).despawn();
|
||||||
|
}
|
||||||
|
for (sfxtype, sfx, path) in PATHS {
|
||||||
|
let source = asset_server.load(*path);
|
||||||
match sfxtype {
|
match sfxtype {
|
||||||
SfxType::BGM => {
|
SfxType::BGM => {
|
||||||
commands.spawn((
|
commands.spawn((
|
||||||
|
@ -137,7 +156,6 @@ pub fn setup(
|
||||||
SfxType::OneOff => ()
|
SfxType::OneOff => ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
commands.insert_resource(Sounds(map));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn toggle_bgm(
|
pub fn toggle_bgm(
|
||||||
|
|
|
@ -108,6 +108,7 @@ pub fn show_deathscreen(
|
||||||
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||||
mut ew_effect: EventWriter<visual::SpawnEffectEvent>,
|
mut ew_effect: EventWriter<visual::SpawnEffectEvent>,
|
||||||
mut ew_respawn: EventWriter<world::RespawnEvent>,
|
mut ew_respawn: EventWriter<world::RespawnEvent>,
|
||||||
|
mut ew_respawnaudiosinks: EventWriter<audio::RespawnSinksEvent>,
|
||||||
mut settings: ResMut<Settings>,
|
mut settings: ResMut<Settings>,
|
||||||
) {
|
) {
|
||||||
for event in er_deathscreen.read() {
|
for event in er_deathscreen.read() {
|
||||||
|
@ -129,6 +130,7 @@ pub fn show_deathscreen(
|
||||||
text.sections[3].value = settings.death_cause.clone();
|
text.sections[3].value = settings.death_cause.clone();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
ew_respawnaudiosinks.send(audio::RespawnSinksEvent);
|
||||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::WakeUp));
|
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::WakeUp));
|
||||||
ew_effect.send(visual::SpawnEffectEvent { class: visual::Effects::FadeIn(Color::BLACK), duration: 0.3 });
|
ew_effect.send(visual::SpawnEffectEvent { class: visual::Effects::FadeIn(Color::BLACK), duration: 0.3 });
|
||||||
ew_respawn.send(world::RespawnEvent);
|
ew_respawn.send(world::RespawnEvent);
|
||||||
|
|
Loading…
Reference in a new issue