diff --git a/src/credits.rs b/src/credits.rs index 6686399..2b6489f 100644 --- a/src/credits.rs +++ b/src/credits.rs @@ -22,14 +22,8 @@ impl Plugin for CreditsPlugin { menu::exit_to_menu.run_if(in_state(GameState::Credits)), ), ) - .add_systems( - OnEnter(GameState::Credits), - activate::, - ) - .add_systems( - OnExit(GameState::Credits), - deactivate::, - ); + .add_systems(OnEnter(GameState::Credits), activate::) + .add_systems(OnExit(GameState::Credits), deactivate::); } } @@ -77,12 +71,9 @@ fn parse_credits(bytes: &[u8]) -> Result { #[derive(Debug, Component)] struct Credits; -#[derive(Debug, Component)] -struct CreditsCamera; - fn init_credits_ui(mut commands: Commands, server: Res) { commands.spawn(( - CreditsCamera, + Credits, Camera2dBundle { camera: Camera { is_active: false, diff --git a/src/display2d.rs b/src/display2d.rs index c17300b..af23a79 100644 --- a/src/display2d.rs +++ b/src/display2d.rs @@ -44,19 +44,15 @@ impl Plugin for Display2dPlugin { .run_if(in_state(GameState::Display2d)) .run_if(any_component_removed::()), update_background.run_if(on_event::()), - // PERF: Only need to run when piece2d or tile2d added - set_sprite.after(game::set_side), - set_transform.after(game::update_board::), + set_transform + .after(game::update_board::) + .run_if(any_component_changed::), + set_piece_sprite.run_if(any_component_changed::), + set_tile_sprite.run_if(any_component_added::), ), ) - .add_systems( - OnEnter(GameState::Display2d), - activate::, - ) - .add_systems( - OnExit(GameState::Display2d), - deactivate::, - ); + .add_systems(OnEnter(GameState::Display2d), activate::) + .add_systems(OnExit(GameState::Display2d), deactivate::); } } @@ -66,9 +62,9 @@ struct SpriteSheet { handle: Handle, } -/// Marker component for the 2d board entity +/// Marker component for the 2d entitys #[derive(Debug, Component)] -struct Board2d; +struct Display2d; /// Marker for 2d piece entities #[derive(Debug, Component)] @@ -77,16 +73,13 @@ pub(crate) struct Piece2d; #[derive(Debug, Component)] struct Tile2d; -#[derive(Debug, Component)] -struct Display2dCamera; - #[derive(Debug, Component)] struct BackgroundImage; /// STARTUP: Initialize 2d gameplay Camera fn initialize_camera(mut commands: Commands) { commands.spawn(( - Display2dCamera, + Display2d, Camera2dBundle { camera: Camera { is_active: false, @@ -163,11 +156,11 @@ fn initialize_board(board: Option>, mut commands: Commands) { if let Some(board) = board { commands .spawn(( + Display2d, SpatialBundle { visibility: Visibility::Hidden, ..default() }, - Board2d, )) .with_children(|parent| { // Spawn tiles @@ -198,41 +191,54 @@ fn initialize_board(board: Option>, mut commands: Commands) { } } -fn set_sprite( +fn set_piece_sprite( mut events: Query< ( &mut TextureAtlasSprite, &mut Handle, - Option<&Piece>, - Option<&Side>, - Option<&Tile>, + &Piece, + &Side, ), - Or<(Added, Added, Changed)>, + Or<(Added, Changed)>, >, sprite_sheet: Option>, ) { if let Some(sprite_sheet) = sprite_sheet { events .iter_mut() - .for_each(|(mut sprite, mut texture_atlas, piece, side, tile)| { - info!("Got sprite update event"); + .for_each(|(mut sprite, mut texture_atlas, piece, side)| { + debug!("Updating sprite {:?} {:?}", piece, side); + if *texture_atlas != sprite_sheet.handle { + *texture_atlas = sprite_sheet.handle.clone(); + } + sprite.index = match (piece, side) { + (Piece::Queen, Side::A) => 2, + (Piece::Queen, Side::B) => 5, + + (Piece::Drone, Side::A) => 3, + (Piece::Drone, Side::B) => 6, + + (Piece::Pawn, Side::A) => 4, + (Piece::Pawn, Side::B) => 7, + }; + }); + } +} +fn set_tile_sprite( + mut events: Query<(&mut TextureAtlasSprite, &mut Handle, &Tile), Added>, + sprite_sheet: Option>, +) { + if let Some(sprite_sheet) = sprite_sheet { + events + .iter_mut() + .for_each(|(mut sprite, mut texture_atlas, tile)| { *texture_atlas = sprite_sheet.handle.clone(); - let s = match (piece, side) { - (Some(Piece::Queen), Some(Side::A)) => 2, - (Some(Piece::Queen), Some(Side::B)) => 5, - (Some(Piece::Drone), Some(Side::A)) => 3, - (Some(Piece::Drone), Some(Side::B)) => 6, - (Some(Piece::Pawn), Some(Side::A)) => 4, - (Some(Piece::Pawn), Some(Side::B)) => 7, - _ => match tile { - Some(Tile::Dark) => 0, - Some(Tile::Light) => 1, - None => 99, - }, + let s = match tile { + Tile::Dark => 0, + Tile::Light => 1, }; *sprite = TextureAtlasSprite::new(s); - debug!("Setting sprite for {:?} {:?}", piece, tile); }); } } @@ -263,7 +269,7 @@ fn active_tile( &GlobalTransform, &BoardIndex, )>, - camera_q: Query<(&Camera, &GlobalTransform), With>, + camera_q: Query<(&Camera, &GlobalTransform), With>, atlases: Res>, mut active: ResMut, ) { @@ -321,10 +327,7 @@ fn select_piece( ((*button, *state) == (MouseButton::Left, ButtonState::Pressed)).then_some(entity) }) .for_each(|entity| { - commands - .entity(entity) - .insert(game::Selected) - .remove_parent(); + commands.entity(entity).insert(game::Selected); writer.send(game::GameEvent::SelectPiece); }); } @@ -332,7 +335,7 @@ fn select_piece( fn move_piece( window: Query<&Window, With>, mut query: Query<&mut Transform, (With, With)>, - camera_query: Query<(&Camera, &GlobalTransform), With>, + camera_query: Query<(&Camera, &GlobalTransform), With>, ) { query.iter_mut().for_each(|mut t| { let (camera, camera_t) = camera_query.single(); diff --git a/src/display3d.rs b/src/display3d.rs index 2f37e3b..445105b 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -21,29 +21,20 @@ impl Plugin for Display3dPlugin { .run_if(in_state(GameState::Display3d)) .run_if(resource_exists::()), ) - .add_systems( - OnEnter(GameState::Display3d), - activate::, - ) - .add_systems( - OnExit(GameState::Display3d), - deactivate::, - ); + .add_systems(OnEnter(GameState::Display3d), activate::) + .add_systems(OnExit(GameState::Display3d), deactivate::); } } #[derive(Debug, Component)] -struct Board3d; +struct Display3d; #[derive(Debug, Component)] pub(crate) struct Piece3d; -#[derive(Debug, Component)] -struct Display3dCamera; - fn initialize_camera(mut commands: Commands) { commands.spawn(( - Display3dCamera, + Display3d, Camera3dBundle { camera: Camera { is_active: false, @@ -103,12 +94,12 @@ fn initialize_board( visibility: Visibility::Hidden, ..default() }, - Board3d, + Display3d, )) .with_children(|parent| { info!("Initializing 3D lights!"); parent.spawn(( - Board3d, + Display3d, PointLightBundle { point_light: PointLight { intensity: 1500.0, @@ -123,7 +114,7 @@ fn initialize_board( info!("Intializeing 3D Board!"); parent .spawn(( - Board3d, + Display3d, SceneBundle { scene: gltf .named_scenes diff --git a/src/game.rs b/src/game.rs index c52b1d6..9d5afb6 100644 --- a/src/game.rs +++ b/src/game.rs @@ -13,15 +13,13 @@ impl Plugin for GamePlugin { ( update_board::.run_if(on_event::()), update_board::.run_if(on_event::()), - set_side.run_if(on_event::()), // TODO: correct run_if? + set_side.run_if(on_event::()), // TODO: correct run_if? ), ) .add_systems( PostUpdate, ( - debug_hovering - .run_if(resource_exists::()) - .run_if(resource_changed::()), + debug_hovering.run_if(resource_exists::()), debug_board.run_if(resource_exists::()), ), ); @@ -290,6 +288,7 @@ pub(crate) fn set_side(mut events: Query<(&mut Side, &BoardIndex), Changed { + debug!("Set side event {:?} {:?} -> {:?}", idx, side, s); if *side != s { *side = s } diff --git a/src/loading.rs b/src/loading.rs new file mode 100644 index 0000000..6eb13ee --- /dev/null +++ b/src/loading.rs @@ -0,0 +1,62 @@ +use crate::prelude::*; + +pub(crate) struct LoadingPlugin; + +impl Plugin for LoadingPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, initialize) + .add_systems(OnEnter(GameState::Loading), activate::) + .add_systems(OnExit(GameState::Loading), deactivate::); + } +} + +#[derive(Debug, Component)] +struct Loading; + +fn initialize(mut commands: Commands) { + commands.spawn(( + Loading, + Camera2dBundle { + camera: Camera { + is_active: false, + ..default() + }, + ..default() + }, + UiCameraConfig { show_ui: true }, + )); + + commands + .spawn(( + Loading, + NodeBundle { + style: Style { + width: Val::Percent(100.0), + height: Val::Percent(100.0), + justify_content: JustifyContent::Center, + align_items: AlignItems::Center, + position_type: PositionType::Absolute, + ..default() + }, + visibility: Visibility::Hidden, + ..default() + }, + )) + .with_children(|parent| { + parent.spawn((TextBundle { + text: Text { + alignment: TextAlignment::Center, + sections: vec![TextSection { + value: "l o a d i n g . . .".into(), + style: TextStyle { + color: Color::WHITE.into(), + ..default() + }, + }], + ..default() + }, + background_color: Color::BLACK.with_a(0.5).into(), + ..default() + },)); + }); +} diff --git a/src/main.rs b/src/main.rs index a18f3ae..1c0b4ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ mod debug; mod display2d; mod display3d; mod game; +mod loading; mod menu; mod prelude; @@ -45,12 +46,13 @@ fn main() { ..default() }), audio::AudioPlugin, + credits::CreditsPlugin, debug::DebugPlugin, display2d::Display2dPlugin, display3d::Display3dPlugin, game::GamePlugin, + loading::LoadingPlugin, menu::MenuPlugin, - credits::CreditsPlugin, )) .run(); } @@ -126,9 +128,9 @@ fn toggle_display_mode( }) } -fn activate( - mut cameras: Query<&mut Camera, With>, - mut entities: Query<&mut Visibility, With>, +fn activate( + mut cameras: Query<&mut Camera, With>, + mut entities: Query<&mut Visibility, With>, ) { cameras.iter_mut().for_each(|mut camera| { camera.is_active = true; @@ -138,9 +140,9 @@ fn activate( }); } -fn deactivate( - mut cameras: Query<&mut Camera, With>, - mut entities: Query<&mut Visibility, With>, +fn deactivate( + mut cameras: Query<&mut Camera, With>, + mut entities: Query<&mut Visibility, With>, ) { cameras.iter_mut().for_each(|mut camera| { camera.is_active = false; @@ -149,3 +151,11 @@ fn deactivate( *visibility = Visibility::Hidden; }); } + +pub(crate) fn any_component_changed(q: Query>) -> bool { + !q.is_empty() +} + +pub(crate) fn any_component_added(q: Query>) -> bool { + !q.is_empty() +} diff --git a/src/menu.rs b/src/menu.rs index 5406c81..03ebfe7 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -21,23 +21,20 @@ impl Plugin for MenuPlugin { ) .run_if(in_state(GameState::Menu)), ) - .add_systems(OnEnter(GameState::Menu), activate::) - .add_systems(OnExit(GameState::Menu), deactivate::); + .add_systems(OnEnter(GameState::Menu), activate::) + .add_systems(OnExit(GameState::Menu), deactivate::); } } #[derive(Debug, Component)] -struct MenuCamera; - -#[derive(Debug, Component)] -struct MenuRoot; +struct Menu; #[derive(Debug, Component)] struct Quit; fn init_menu_ui(mut commands: Commands) { commands.spawn(( - MenuCamera, + Menu, Camera2dBundle { camera: Camera { is_active: false, @@ -50,7 +47,7 @@ fn init_menu_ui(mut commands: Commands) { commands .spawn(( - MenuRoot, + Menu, NodeBundle { style: Style { width: Val::Percent(100.0),