From 9cb7043eed8b5cbed0c23d72e4a3a92c3ff9823d Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Thu, 26 Oct 2023 21:48:33 -0700 Subject: [PATCH] Some improvements... 2d breaks when you select in 3d though... --- assets/models/Martian Chess.glb | 4 +-- src/display2d.rs | 56 ++++++++++++++++++--------------- src/display3d.rs | 56 ++++++++++++++++++++------------- src/game.rs | 9 ++++-- 4 files changed, 72 insertions(+), 53 deletions(-) diff --git a/assets/models/Martian Chess.glb b/assets/models/Martian Chess.glb index 85b072c..4f94fb4 100644 --- a/assets/models/Martian Chess.glb +++ b/assets/models/Martian Chess.glb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e48f65900648c1d5972aa14fea00f39e3cc7d4f8060df34d14f423cc621fc82e -size 50950760 +oid sha256:3e69424bcc770fe206da12b2539a4a6f0d7dd2649e25e24fdcc5335d70666fa7 +size 29632044 diff --git a/src/display2d.rs b/src/display2d.rs index af23a79..557a5d9 100644 --- a/src/display2d.rs +++ b/src/display2d.rs @@ -45,10 +45,10 @@ impl Plugin for Display2dPlugin { .run_if(any_component_removed::()), update_background.run_if(on_event::()), set_transform - .after(game::update_board::) + .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::), + set_tile_sprite.run_if(any_component_added::), ), ) .add_systems(OnEnter(GameState::Display2d), activate::) @@ -64,14 +64,7 @@ struct SpriteSheet { /// Marker component for the 2d entitys #[derive(Debug, Component)] -struct Display2d; - -/// Marker for 2d piece entities -#[derive(Debug, Component)] -pub(crate) struct Piece2d; - -#[derive(Debug, Component)] -struct Tile2d; +pub(crate) struct Display2d; #[derive(Debug, Component)] struct BackgroundImage; @@ -117,6 +110,7 @@ fn set_background( ) { commands.spawn(( BackgroundImage, + Display2d, SpriteBundle { texture: server.load("images/mars-daybreak.png"), sprite: Sprite { @@ -172,7 +166,7 @@ fn initialize_board(board: Option>, mut commands: Commands) { let s = (x % 2) ^ (y % 2); let tile = if s == 0 { Tile::Dark } else { Tile::Light }; - parent.spawn((tile, index, Tile2d, SpriteSheetBundle { ..default() })); + parent.spawn((tile, index, Display2d, SpriteSheetBundle { ..default() })); } // Spawn pieces @@ -181,7 +175,7 @@ fn initialize_board(board: Option>, mut commands: Commands) { parent.spawn(( piece.clone(), - Piece2d, + Display2d, index.clone(), side, SpriteSheetBundle { ..default() }, @@ -199,7 +193,7 @@ fn set_piece_sprite( &Piece, &Side, ), - Or<(Added, Changed)>, + (With, Or<(Added, Changed)>), >, sprite_sheet: Option>, ) { @@ -226,7 +220,10 @@ fn set_piece_sprite( } fn set_tile_sprite( - mut events: Query<(&mut TextureAtlasSprite, &mut Handle, &Tile), Added>, + mut events: Query< + (&mut TextureAtlasSprite, &mut Handle, &Tile), + (Added, With), + >, sprite_sheet: Option>, ) { if let Some(sprite_sheet) = sprite_sheet { @@ -248,7 +245,7 @@ fn set_transform( mut events: Query< (&mut Transform, &BoardIndex), ( - Or<(With, With)>, + With, Or<(Changed, Added)>, ), >, @@ -309,7 +306,7 @@ fn active_tile( fn select_piece( mut events: EventReader, - pieces: Query<(Entity, &BoardIndex), With>, + pieces: Query<(Entity, &BoardIndex), (With, With)>, active: Res, mut commands: Commands, mut writer: EventWriter, @@ -334,7 +331,7 @@ fn select_piece( fn move_piece( window: Query<&Window, With>, - mut query: Query<&mut Transform, (With, With)>, + mut query: Query<&mut Transform, (With, With, With)>, camera_query: Query<(&Camera, &GlobalTransform), With>, ) { query.iter_mut().for_each(|mut t| { @@ -355,8 +352,11 @@ fn move_piece( /// fn place_piece( mut events: EventReader, - current: Query<(Entity, &BoardIndex), (With, With)>, - pieces: Query<&BoardIndex, (Without, With)>, + current: Query< + (Entity, &BoardIndex), + (With, With, With), + >, + pieces: Query<&BoardIndex, (Without, With, With)>, active: Res, mut board: ResMut, mut commands: Commands, @@ -373,11 +373,15 @@ fn place_piece( } }) .filter_map(|idx| { - (!pieces.iter().any(|board_index| board_index == idx)).then_some(( - current.single().0, - current.single().1, - idx, - )) + if !current.is_empty() { + (!pieces.iter().any(|board_index| board_index == idx)).then_some(( + current.single().0, + current.single().1, + idx, + )) + } else { + None + } }) .for_each(|(entity, from, to)| match board.move_piece(from, to) { Ok(moves) => { @@ -395,7 +399,7 @@ fn place_piece( fn cancel_place( mut events: EventReader, - current: Query, With)>, + current: Query, With, With)>, mut commands: Commands, mut writer: EventWriter, ) { @@ -414,7 +418,7 @@ fn cancel_place( fn snap_back_cancel( mut events: RemovedComponents, - query: Query<&game::BoardIndex, With>, + query: Query<&game::BoardIndex, (With, With)>, mut move_events: EventWriter, ) { events.iter().for_each(|entity| { diff --git a/src/display3d.rs b/src/display3d.rs index 81bd2f9..7846970 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -22,8 +22,8 @@ impl Plugin for Display3dPlugin { Update, ( menu::exit_to_menu.run_if(in_state(GameState::Display3d)), - set_piece_model.run_if(any_component_added::), - set_board_model.run_if(any_component_added::), + set_piece_model.run_if(any_component_added::), + set_board_model.run_if(any_component_added::), set_piece_position.run_if(any_component_changed::), set_piece_texture.run_if(any_component_changed::), select_3d @@ -54,13 +54,7 @@ impl Plugin for Display3dPlugin { } #[derive(Debug, Component)] -struct Display3d; - -#[derive(Debug, Component)] -pub(crate) struct Piece3d; - -#[derive(Debug, Component)] -pub(crate) struct Board3d; +pub(crate) struct Display3d; #[derive(Debug, Resource)] struct AssetsMap { @@ -127,14 +121,14 @@ fn initialize(mut commands: Commands, board: Res, assets: Res>, assets: Res) { /// Set the model for each piece based on the game::Piece::* marker fn set_piece_model( - mut events: Query<(&mut Handle, &Piece), Added>, + mut events: Query<(&mut Handle, &Piece), (Added, With)>, assets_map: Res, gltfs: Res>, ) { @@ -179,7 +173,7 @@ fn set_piece_model( } fn set_board_model( - mut events: Query<&mut Handle, With>, + mut events: Query<&mut Handle, (With, With)>, assets_map: Res, gltfs: Res>, ) { @@ -195,7 +189,10 @@ fn set_board_model( /// Sets a piece location given it's board index fn set_piece_position( - mut events: Query<(&mut Transform, &BoardIndex), (With, Changed)>, + mut events: Query< + (&mut Transform, &BoardIndex), + (With, With, Changed), + >, ) { events.iter_mut().for_each(|(mut t, i)| { t.translation = board_translation(i); @@ -267,8 +264,8 @@ fn mouse_zoom( /// PERF: We are saving what to work on in a Vector which is bad. /// CAVEAT: We are only exeucting this when a piece changes or state is changed. fn set_piece_texture( - events: Query<(Entity, &Piece, &Side), (With, Changed)>, - all: Query<(Entity, &Piece, &Side), With>, + events: Query<(Entity, &Piece, &Side), (With, With, Changed)>, + all: Query<(Entity, &Piece, &Side), (With, With)>, gltfs: Res>, assets_map: Res, children: Query<&Children>, @@ -377,16 +374,17 @@ fn set_piece_texture( } /// Function for selecting entities based on ray intersection +/// There is a bug where we are selecting multiple entities... fn select_3d( mut events: EventReader, query: Query<(Entity, &Handle, &GlobalTransform)>, meshes: Res>, - cameras: Query<(&Camera, &GlobalTransform)>, + cameras: Query<(&Camera, &GlobalTransform), With>, windows: Query<&Window, With>, - parents: Query, Without)>, + parents: Query, With)>, children: Query<&Children>, mut commands: Commands, - selected: Query, With)>, + selected: Query, With, With)>, ) { events .iter() @@ -412,9 +410,12 @@ fn select_3d( }) .iter() .for_each(|&parent| { - // TODO: Only remove/insert component if different selected.iter().for_each(|s| { - commands.entity(s).remove::(); + if s != parent { + commands + .entity(s) + .remove::(); + } }); commands.entity(parent).insert(game::Selected); }); @@ -431,10 +432,21 @@ fn select_3d( } fn selected_gizmo( - selected: Query<&Transform, (With, With)>, + selected: Query<&Transform, (With, With, With)>, mut gizmos: Gizmos, ) { selected.iter().for_each(|transform| { gizmos.cuboid(transform.clone(), Color::GREEN); }) } + +// Animations +// * QueenPickup +// * QueenPutDown +// * QueenIdle +// * DronePickup +// * DronePutDown +// * DroneIdle +// * PawnPickup +// * PawnPutDown +// * PawnIdle diff --git a/src/game.rs b/src/game.rs index 9d5afb6..da1d8b0 100644 --- a/src/game.rs +++ b/src/game.rs @@ -11,8 +11,8 @@ impl Plugin for GamePlugin { .add_systems( Update, ( - update_board::.run_if(on_event::()), - update_board::.run_if(on_event::()), + update_board::.run_if(on_event::()), + update_board::.run_if(on_event::()), set_side.run_if(on_event::()), // TODO: correct run_if? ), ) @@ -39,6 +39,9 @@ pub(crate) enum Tile { Light, } +#[derive(Debug, Component)] +pub(crate) struct BoardComponent; + // manually for the type. impl std::fmt::Display for Piece { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -266,7 +269,7 @@ fn debug_board(board: Res, mut debug_info: ResMut) { /// Only update the tiles without a corresponding board piece pub(crate) fn update_board( mut events: EventReader, - mut pieces: Query<(Entity, &mut BoardIndex), With>, + mut pieces: Query<(Entity, &mut BoardIndex), (With, With)>, mut commands: Commands, ) { events.iter().for_each(|Move { from, to, .. }| {