Skip to content
Snippets Groups Projects
mod.rs 3.16 KiB
Newer Older
Louis's avatar
Louis committed
use bevy::app::Plugin;
use bevy::asset::{Handle, LoadState};
use bevy::prelude::*;
use bevy_kira_audio::AudioSource;

/// We store our asset handles in this to avoid Bevy from dropping the assets and reloading
/// when we switch tracks
Louis's avatar
Louis committed
#[derive(Resource)]
Louis's avatar
Louis committed
pub struct AudioResources {
	pub white_kitty: Handle<AudioSource>,
	pub great_madeja: Handle<AudioSource>,
}

Louis's avatar
Louis committed
#[derive(Default, Eq, PartialEq, Debug, Clone, Hash, States)]
Louis's avatar
Louis committed
pub enum AppState {
	#[default]
	Loading,
	Running,
}

pub fn load_resources(mut commands: Commands, assets: Res<AssetServer>) {
	let white_kitty = assets.load("The-White-Kitty.mp3");
	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>,
Louis's avatar
Louis committed
	appstate: Res<State<AppState>>,
	mut next_state: ResMut<NextState<AppState>>,
Louis's avatar
Louis committed
) {
Louis's avatar
Louis committed
	let load_state = assets.get_group_load_state(vec![
		resources.white_kitty.id(),
		resources.great_madeja.id(),
	]);
Louis's avatar
Louis committed

	match load_state {
		LoadState::Loaded => {
Louis's avatar
Louis committed
			log::info!("STATE {:?}", appstate);
			*next_state = NextState(Some(AppState::Running)); // appstate.set(AppState::Running);
Louis's avatar
Louis committed
		}
		LoadState::Loading => {}
		_ => {
			log::error!("The resources are in a bad state! This is a problem");
		}
	}
}

Louis's avatar
Louis committed
// pub fn has_audio_resources(res: Option<Res<AudioResources>>) -> ShouldRun {
// 	res.is_some().into()
// }
// pub fn is_state_loading(state: Res<AppState>) -> ShouldRun {
// 	(*state == AppState::Loading).into()
// }
// pub fn is_state_running(state: Res<AppState>) -> ShouldRun {
// 	(*state == AppState::Running).into()
// }
Louis's avatar
Louis committed

/// This component allows us to easily grab the on screen text
#[derive(Component)]
pub struct TextMarker;
/// This component allows us to easily grab the blank details text area
#[derive(Component)]
pub struct DetailsMarker;

pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
Louis's avatar
Louis committed
	commands.spawn(Camera2dBundle::default());
Louis's avatar
Louis committed
	commands
Louis's avatar
Louis committed
		.spawn(NodeBundle {
Louis's avatar
Louis committed
			style: Style {
				size: Size::new(Val::Percent(100.0), Val::Percent(100.0)),
				justify_content: JustifyContent::Center,
				align_items: AlignItems::Center,
				flex_direction: FlexDirection::Column,
				..Default::default()
			},
			..Default::default()
		})
		.with_children(|children| {
			children
Louis's avatar
Louis committed
				.spawn(TextBundle {
Louis's avatar
Louis committed
					text: Text::from_section(
						"Loading Audio Tracks",
						TextStyle {
							color: Color::BLACK,
							font_size: 48.0,
							font: assets.load("KenneyBlocks.ttf"),
						},
					),
					..Default::default()
				})
				.insert(TextMarker);
			children
Louis's avatar
Louis committed
				.spawn(TextBundle {
Louis's avatar
Louis committed
					text: Text::from_section(
						"...",
						TextStyle {
							color: Color::BLACK,
							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) {
Louis's avatar
Louis committed
		app.add_state::<AppState>()
Louis's avatar
Louis committed
			.add_startup_system(load_resources)
			.add_startup_system(create_ui)
Louis's avatar
Louis committed
			.add_system(
				check_load_state
					.run_if(resource_exists::<AudioResources>())
					.run_if(in_state(AppState::Loading)),