45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
use bevy::{audio::Volume, prelude::*};
|
|
use rand::random_range;
|
|
|
|
pub struct MusicPlayerPlugin;
|
|
|
|
impl Plugin for MusicPlayerPlugin {
|
|
fn build(&self, app: &mut App) {
|
|
app.add_systems(Startup, setup)
|
|
.add_systems(Update, try_play);
|
|
}
|
|
}
|
|
|
|
#[derive(Resource)]
|
|
struct Soundtrack(Vec<Handle<AudioSource>>);
|
|
|
|
#[derive(Component)]
|
|
struct MusicPlayer;
|
|
|
|
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
commands.insert_resource(Soundtrack(vec![
|
|
asset_server.load("music/fostral.wav"),
|
|
asset_server.load("music/glorx.wav"),
|
|
asset_server.load("music/rocknrolldixie.wav"),
|
|
asset_server.load("music/whistler.wav"),
|
|
]));
|
|
|
|
commands.spawn(MusicPlayer);
|
|
}
|
|
|
|
fn try_play(
|
|
mut commands: Commands,
|
|
player: Option<Single<Entity, (With<MusicPlayer>, Without<AudioPlayer>)>>,
|
|
soundtrack: Res<Soundtrack>,
|
|
) {
|
|
if let Some(music_player) = player {
|
|
commands.entity(music_player.entity()).insert((
|
|
AudioPlayer::new(soundtrack.0[random_range(0..soundtrack.0.len())].clone()),
|
|
PlaybackSettings {
|
|
volume: Volume::Linear(0.2),
|
|
mode: bevy::audio::PlaybackMode::Remove,
|
|
..default()
|
|
},
|
|
));
|
|
}
|
|
}
|