diff --git a/assets/music/rocknrolldixie.wav b/assets/music/rocknrolldixie.wav new file mode 100644 index 0000000..4a6f31f Binary files /dev/null and b/assets/music/rocknrolldixie.wav differ diff --git a/assets/music/whistler.wav b/assets/music/whistler.wav new file mode 100644 index 0000000..68e1d99 Binary files /dev/null and b/assets/music/whistler.wav differ diff --git a/src/main.rs b/src/main.rs index 057fd94..9fa5969 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,11 @@ -use bevy::{audio::Volume, prelude::*}; +use bevy::prelude::*; mod animation; mod buttons; mod card; mod dev_tools; mod grid; +mod music_player; mod turns; mod unit; @@ -19,6 +20,7 @@ fn main() { grid::GridPlugin, turns::TurnSystemPlugin, unit::UnitPlugin, + music_player::MusicPlayerPlugin, )) .add_systems(Startup, setup) .run(); @@ -26,7 +28,6 @@ fn main() { fn setup(asset_server: Res, mut commands: Commands) { let background = asset_server.load::("sprites/field.png"); - let music = asset_server.load("music/fostral.wav"); commands.spawn(Camera2d); @@ -34,13 +35,4 @@ fn setup(asset_server: Res, mut commands: Commands) { Sprite::from_image(background), Transform::from_xyz(0., 0., -100.), )); - - commands.spawn(( - AudioPlayer::new(music), - PlaybackSettings { - volume: Volume::Linear(0.2), - mode: bevy::audio::PlaybackMode::Loop, - ..default() - }, - )); } diff --git a/src/music_player.rs b/src/music_player.rs new file mode 100644 index 0000000..15be05f --- /dev/null +++ b/src/music_player.rs @@ -0,0 +1,45 @@ +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>); + +#[derive(Component)] +struct MusicPlayer; + +fn setup(mut commands: Commands, asset_server: Res) { + 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, Without)>>, + soundtrack: Res, +) { + 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() + }, + )); + } +}