fix(wasm): request permission for media autoplay if needed

This commit is contained in:
Pascal Engélibert 2022-08-28 19:33:41 +02:00
commit 53bf4b1aef
Signed by: tuxmain
GPG key ID: 3504BC6D362F7DCA
14 changed files with 44 additions and 467 deletions

View file

@ -4,8 +4,7 @@ pub struct AudioSystemPlugin;
impl Plugin for AudioSystemPlugin {
fn build(&self, app: &mut App) {
app
.init_resource::<AudioAssets>()
app.init_resource::<AudioAssets>()
.add_startup_system(load_audio);
}
}
@ -23,27 +22,27 @@ pub fn play_audio(
color: Vec4,
volume: f32,
) {
for i in 0 .. 3 {
for i in 0..3 {
audio.play_with_settings(
audio_set[i].clone(),
PlaybackSettings::ONCE.with_volume(color[i] * volume)
PlaybackSettings::ONCE.with_volume(color[i] * volume),
);
}
}
fn load_audio(
mut audio_assets: ResMut<AudioAssets>,
asset_server: Res<AssetServer>,
) {
fn load_audio(mut audio_assets: ResMut<AudioAssets>, asset_server: Res<AssetServer>) {
audio_assets.notes[0] = asset_server.load::<AudioSource, &str>("sound/notes/a5.ogg");
audio_assets.notes[1] = asset_server.load::<AudioSource, &str>("sound/notes/cs6.ogg");
audio_assets.notes[2] = asset_server.load::<AudioSource, &str>("sound/notes/e6.ogg");
audio_assets.reverb_notes[0] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/a5.ogg");
audio_assets.reverb_notes[1] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/cs6.ogg");
audio_assets.reverb_notes[2] = asset_server.load::<AudioSource, &str>("sound/reverb_notes/e6.ogg");
audio_assets.reverb_notes[0] =
asset_server.load::<AudioSource, &str>("sound/reverb_notes/a5.ogg");
audio_assets.reverb_notes[1] =
asset_server.load::<AudioSource, &str>("sound/reverb_notes/cs6.ogg");
audio_assets.reverb_notes[2] =
asset_server.load::<AudioSource, &str>("sound/reverb_notes/e6.ogg");
audio_assets.warp_notes[0] = asset_server.load::<AudioSource, &str>("sound/warp_notes/a5.ogg");
audio_assets.warp_notes[1] = asset_server.load::<AudioSource, &str>("sound/warp_notes/cs6.ogg");
audio_assets.warp_notes[2] = asset_server.load::<AudioSource, &str>("sound/warp_notes/e6.ogg");
}
}

View file

@ -2,8 +2,8 @@
#![allow(clippy::too_many_arguments)]
pub use crate::filters::*;
use crate::{AppState, audio_system};
use crate::levels;
use crate::{audio_system, AppState};
use bevy::{
ecs::system::EntityCommands,
@ -337,7 +337,7 @@ fn char_char_collision_event_system(
c1_player.is_some() || c2_player.is_some(),
);
audio_system::play_audio(&audio_assets.warp_notes, &audio, new_color.into(), 1.0);
audio_system::play_audio(&audio_assets.warp_notes, &audio, new_color, 1.0);
}
}
}
@ -364,7 +364,7 @@ fn char_platform_collision_event_system(
}
}
}
CollisionEvent::Stopped(e1, e2, flags) => {
if *flags == CollisionEventFlags::SENSOR {
if let (Ok(mut platform_count), Ok(_)) =
@ -412,25 +412,14 @@ fn collision_event_system(
}
}
} else if *flags == CollisionEventFlags::SENSOR {
if let (Ok((mut c_color, _c_transform, mut c_material, c_player)), Ok(filter)) = (
if let (Ok((mut c_color, _c_transform, mut c_material, _c_player)), Ok(filter)) = (
character_query.get_mut(*e1),
pass_through_filter_query.get(*e2),
) {
c_color.0 = filter.apply(c_color.0);
*c_material = materials.add(ColorMaterial::from(c_color.0));
if c_player.is_some() {
audio
.send(AudioMsg::Color([
c_color.0.r(),
c_color.0.g(),
c_color.0.b(),
]))
.ok();
audio.send(AudioMsg::Switch).ok();
}
} else if let (
Ok((mut c_color, _c_transform, mut c_material, c_player)),
Ok((mut c_color, _c_transform, mut c_material, _c_player)),
Ok(filter),
) = (
character_query.get_mut(*e2),
@ -438,17 +427,6 @@ fn collision_event_system(
) {
c_color.0 = filter.apply(c_color.0);
*c_material = materials.add(ColorMaterial::from(c_color.0));
if c_player.is_some() {
audio
.send(AudioMsg::Color([
c_color.0.r(),
c_color.0.g(),
c_color.0.b(),
]))
.ok();
audio.send(AudioMsg::Switch).ok();
}
}
}
}
@ -568,8 +546,8 @@ fn camera_system(
time: Res<Time>,
mut zoom_timer: ResMut<levels::ZoomTimer>,
) {
fn lerp(x: f32, y: f32, t: f32,) -> f32 {
return ((y - x) * t) + x;
fn lerp(x: f32, y: f32, t: f32) -> f32 {
((y - x) * t) + x
}
const MARGIN: f32 = 300.0;
@ -637,7 +615,11 @@ fn level_keyboard_system(
commands.entity(entity).despawn_recursive();
}
if app_state.replace(AppState::Game).is_err() {
crate::levels::setup_level(&mut level_startup_event, &mut camera_query, &mut zoom_timer);
crate::levels::setup_level(
&mut level_startup_event,
&mut camera_query,
&mut zoom_timer,
);
}
}
}

View file

@ -14,9 +14,7 @@ pub struct ZoomTimer(pub Timer);
impl Default for ZoomTimer {
fn default() -> Self {
Self {
0: Timer::new(Duration::new(2, 0), false),
}
Self(Timer::new(Duration::new(2, 0), false))
}
}

View file

@ -3,12 +3,12 @@
#[cfg(not(target_arch = "wasm32"))]
mod editor;
mod audio_system;
mod filters;
mod game;
mod levels;
mod menu;
mod particle_effect;
mod audio_system;
use bevy::{
asset::{Asset, HandleId, LoadState},
@ -65,7 +65,6 @@ fn main() {
title: "Lux synthesĕ".into(),
..Default::default()
})
.insert_resource(audio_event_sender)
.insert_resource(UseEditor(use_editor))
.add_state(AppState::Loading)
.insert_resource(game::FirstLevel(first_level))

View file

@ -20,22 +20,6 @@ impl Plugin for MenuPlugin {
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let font = asset_server.get_handle("UacariLegacy-Thin.ttf");
#[cfg(target_arch = "wasm32")]
commands
.spawn_bundle(Text2dBundle {
text: Text::from_section(
"Note:\nAudio is NOT available in the WASM build.",
TextStyle {
font: font.clone(),
font_size: 24.0,
color: Color::rgba(1., 0.4, 0.4, 1.),
},
)
.with_alignment(TextAlignment::CENTER),
transform: Transform::from_xyz(0., -128.0, 0.),
..Default::default()
})
.insert(Menu);
commands
.spawn_bundle(Text2dBundle {
text: Text::from_section(