use bevy::platform::hash::RandomState; use super::*; /// A good starting place for creating a game building on top of the base Bevy app pub struct BaseGamePlugin { pub title: String, pub name: String, pub game_type: GameType, } pub enum GameType { Three, Two, } impl Default for BaseGamePlugin { fn default() -> Self { BaseGamePlugin { title: "My Game".into(), name: "mygame".into(), game_type: GameType::Three, } } } impl Plugin for BaseGamePlugin { fn build(&self, app: &mut App) { app.add_plugins( DefaultPlugins .set(WindowPlugin { primary_window: Some(Window { fit_canvas_to_parent: true, canvas: Some(format!("#{}-canvas", self.name)), ..default() }), ..default() }) .set(ImagePlugin::default_nearest()), ) .add_plugins(DebuggingPlugin) .add_plugins(MeshPickingPlugin) .add_plugins(LoadingPlugin) .add_plugins(BaseUiPlugin) .init_resource::(); match self.game_type { GameType::Two => app.add_systems(Startup, create_camera_2d), GameType::Three => app.add_systems(Startup, create_camera_3d), }; } } /// System to toggle the visibility of entities based on their state pub fn toggle_state_visibility( mut q: Query<(Entity, &mut Visibility, &S)>, curr: Res>, ) { q.iter_mut().for_each(|(e, mut v, s)| { if curr.get() == s { *v = Visibility::Inherited; } else { *v = Visibility::Hidden; } debug!("Changing visibility of {:?} to {:?}", e, *v); }); } pub fn create_camera_3d(mut commands: Commands) { // 3d camera info!("Spawning 3d camera"); commands.spawn(( Camera3d { ..default() }, Camera { ..default() }, AmbientLight::default(), )); } pub fn create_camera_2d(mut commands: Commands) { // 2d camera info!("Spawning 2d camera"); commands.spawn((Camera2d, Camera { ..default() })); } #[derive(Default, Resource)] pub struct Rand(pub RandomState);