music player

This commit is contained in:
Rendo 2026-01-30 23:39:10 +05:00
commit e4b14d94ac
4 changed files with 48 additions and 11 deletions

View file

@ -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<AssetServer>, mut commands: Commands) {
let background = asset_server.load::<Image>("sprites/field.png");
let music = asset_server.load("music/fostral.wav");
commands.spawn(Camera2d);
@ -34,13 +35,4 @@ fn setup(asset_server: Res<AssetServer>, 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()
},
));
}

45
src/music_player.rs Normal file
View file

@ -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<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()
},
));
}
}