use bevy::asset::{LoadState, RecursiveDependencyLoadState};
use bevy::prelude::*;
use bevy_kira_audio::AudioSource;
#[derive(Resource)]
pub struct AudioResources {
pub white_kitty: Handle<AudioSource>,
pub great_madeja: Handle<AudioSource>,
}
#[derive(Default, Eq, PartialEq, Debug, Clone, Hash, States)]
pub enum AppState {
#[default]
Loading,
Running,
}
pub fn load_resources(mut commands: Commands, assets: Res<AssetServer>) {
let white_kitty = assets.load("The-White-Kitty.ogg");
let great_madeja = assets.load("The-Great-Madeja.mp3");
commands.insert_resource(AudioResources {
white_kitty,
great_madeja,
})
}
pub fn check_load_state(
assets: Res<AssetServer>,
resources: Res<AudioResources>,
mut next_state: ResMut<NextState<AppState>>,
) {
let load_list = vec![resources.white_kitty.id(), resources.great_madeja.id()];
let loaded = load_list
.iter()
.map(|a| assets.get_load_states(a.untyped()))
.all(|state| match state {
None => false,
Some((own, _, deps)) => {
own == LoadState::Loaded && deps == RecursiveDependencyLoadState::Loaded
}
});
if loaded {
next_state.set(AppState::Running);
}
}
#[derive(Component)]
pub struct TextMarker;
#[derive(Component)]
pub struct DetailsMarker;
pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
commands.spawn(Camera2dBundle::default());
commands
.spawn(NodeBundle {
style: Style {
width: Val::Percent(100.0),
height: Val::Percent(100.0),
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
flex_direction: FlexDirection::Column,
..Default::default()
},
..Default::default()
})
.with_children(|children| {
children
.spawn(TextBundle {
text: Text::from_section(
"Loading Audio Tracks",
TextStyle {
color: Color::ANTIQUE_WHITE,
font_size: 48.0,
font: assets.load("KenneyBlocks.ttf"),
},
),
..Default::default()
})
.insert(TextMarker);
children
.spawn(TextBundle {
text: Text::from_section(
"...",
TextStyle {
color: Color::ANTIQUE_WHITE,
font_size: 32.0,
font: assets.load("KenneyBlocks.ttf"),
},
),
..Default::default()
})
.insert(DetailsMarker);
});
}
pub struct SetupPlugin;
impl Plugin for SetupPlugin {
fn build(&self, app: &mut App) {
app.init_state::<AppState>()
.add_systems(Startup, (load_resources, create_ui))
.add_systems(
Update,
check_load_state
.run_if(resource_exists::<AudioResources>)
.run_if(in_state(AppState::Loading)),
);
}
}