Possible solution to cancel hover and music audio

bevy0.12
Elijah Voigt 2 years ago
parent cf68b7aecf
commit 087b427506

@ -2,15 +2,15 @@
/// TODO: Custom Asset: FmodEventMapper /// TODO: Custom Asset: FmodEventMapper
/// ///
use crate::prelude::*; use crate::prelude::*;
use bevy_fmod::prelude::AudioSource;
use bevy_fmod::prelude::*;
use serde::Deserialize;
use bevy::{ use bevy::{
asset::{AssetLoader, LoadContext, LoadedAsset}, asset::{AssetLoader, LoadContext, LoadedAsset},
prelude::*, prelude::*,
reflect::{TypePath, TypeUuid}, reflect::{TypePath, TypeUuid},
utils::BoxedFuture, utils::BoxedFuture,
}; };
use bevy_fmod::prelude::AudioSource;
use bevy_fmod::prelude::*;
use serde::Deserialize;
pub(crate) struct AudioPlugin; pub(crate) struct AudioPlugin;
@ -28,7 +28,8 @@ impl Plugin for AudioPlugin {
"./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank", "./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank",
], ],
}); });
app.add_asset::<AudioSettings>().init_asset_loader::<AudioSettingsLoader>(); app.add_asset::<AudioSettings>()
.init_asset_loader::<AudioSettingsLoader>();
app.add_systems(OnEnter(GameState::Menu), play_background); app.add_systems(OnEnter(GameState::Menu), play_background);
app.add_systems( app.add_systems(
@ -42,23 +43,22 @@ impl Plugin for AudioPlugin {
} }
} }
#[derive(Event, Debug)] #[derive(Event, Debug, PartialEq)]
pub enum AudioEvent { pub enum AudioEvent {
MainMusic, MainMusic,
StopMainMusic,
MenuSelect, MenuSelect,
PickUp, PickUp,
PutDown, PutDown,
Idle, Idle,
StopIdle,
Invalid, Invalid,
} }
#[derive(Resource)] #[derive(Resource)]
struct AudioTweakfile(Handle<AudioSettings>); struct AudioTweakfile(Handle<AudioSettings>);
fn load_tweakfile( fn load_tweakfile(server: Res<AssetServer>, mut commands: Commands) {
server: Res<AssetServer>,
mut commands: Commands,
) {
let handle: Handle<AudioSettings> = server.load("audio/martian.audio.tweak"); let handle: Handle<AudioSettings> = server.load("audio/martian.audio.tweak");
commands.insert_resource(AudioTweakfile(handle)); commands.insert_resource(AudioTweakfile(handle));
} }
@ -73,18 +73,21 @@ fn play_audio(mut events: Query<&AudioSource, Added<AudioSource>>) {
fn audio_trigger( fn audio_trigger(
mut events: EventReader<AudioEvent>, mut events: EventReader<AudioEvent>,
sources: Query<&AudioSource>,
studio: Res<FmodStudio>, studio: Res<FmodStudio>,
mut commands: Commands, mut commands: Commands,
server: Res<AssetServer>, server: Res<AssetServer>,
audio_settings: Res<Assets<AudioSettings>>, audio_settings: Res<Assets<AudioSettings>>,
display_state: Res<State<DisplayState>>, display_state: Res<State<DisplayState>>,
) { ) {
let tweak = audio_settings.get(&server.load("audio/martian.audio.tweak")).expect("Load audio tweakfile"); let tweak = audio_settings
.get(&server.load("audio/martian.audio.tweak"))
.expect("Load audio tweakfile");
debug!("Audio tweaks: {:?}", tweak); debug!("Audio tweaks: {:?}", tweak);
let state = display_state.get(); let state = display_state.get();
events.iter().for_each(|event| { events.iter().for_each(|event| {
let aud = match event { let aud = match event {
AudioEvent::MainMusic => tweak.music.main.clone(), AudioEvent::MainMusic | AudioEvent::StopMainMusic => tweak.music.main.clone(),
AudioEvent::MenuSelect => tweak.menu.select.clone(), AudioEvent::MenuSelect => tweak.menu.select.clone(),
AudioEvent::PickUp => match state { AudioEvent::PickUp => match state {
DisplayState::Display2d => tweak.display2d.pick_up.clone(), DisplayState::Display2d => tweak.display2d.pick_up.clone(),
@ -94,7 +97,7 @@ fn audio_trigger(
DisplayState::Display2d => tweak.display2d.put_down.clone(), DisplayState::Display2d => tweak.display2d.put_down.clone(),
DisplayState::Display3d => tweak.display3d.put_down.clone(), DisplayState::Display3d => tweak.display3d.put_down.clone(),
}, },
AudioEvent::Idle => match state { AudioEvent::Idle | AudioEvent::StopIdle => match state {
DisplayState::Display2d => tweak.display2d.idle.clone(), DisplayState::Display2d => tweak.display2d.idle.clone(),
DisplayState::Display3d => tweak.display3d.idle.clone(), DisplayState::Display3d => tweak.display3d.idle.clone(),
}, },
@ -103,11 +106,27 @@ fn audio_trigger(
DisplayState::Display3d => tweak.display3d.invalid.clone(), DisplayState::Display3d => tweak.display3d.invalid.clone(),
}, },
}; };
// There is an event for this
if !aud.is_empty() { if !aud.is_empty() {
let event_str = format!("event:{}", aud); let event_str = format!("event:{}", aud);
if let Ok(event_description) = studio.0.get_event(event_str.as_str()) { if let Ok(event_description) = studio.0.get_event(event_str.as_str()) {
info!("Playing FMOD {:?}", event_str); let audio_source = AudioSource::new(event_description);
commands.spawn(AudioSource::new(event_description)); // We are stopping a playing event
if *event == AudioEvent::StopIdle || *event == AudioEvent::StopMainMusic {
info!("Stopping audio {}", event_str);
// TODO: Find and stop playing instances of this audio
sources
.iter()
.filter(|source| {
format!("{:?}", source.event_instance)
== format!("{:?}", audio_source.event_instance)
})
.for_each(|source| source.stop());
// we are playing a sound
} else {
info!("Playing audoi {}", event_str);
commands.spawn(audio_source);
}
} else { } else {
warn!("Music not found for {:?}", event_str); warn!("Music not found for {:?}", event_str);
} }

@ -372,6 +372,7 @@ pub(crate) fn update_board(
*index = to_idx.clone(); *index = to_idx.clone();
if !(*played) { if !(*played) {
audio_events.send(audio::AudioEvent::PutDown); audio_events.send(audio::AudioEvent::PutDown);
audio_events.send(audio::AudioEvent::StopIdle);
*played = true; *played = true;
} }
} }

Loading…
Cancel
Save