Some improvements... 2d breaks when you select in 3d though...

selection-refactor
Elijah Voigt 2 years ago
parent df74674c96
commit 9cb7043eed

BIN
assets/models/Martian Chess.glb (Stored with Git LFS)

Binary file not shown.

@ -45,10 +45,10 @@ impl Plugin for Display2dPlugin {
.run_if(any_component_removed::<game::Selected>()), .run_if(any_component_removed::<game::Selected>()),
update_background.run_if(on_event::<WindowResized>()), update_background.run_if(on_event::<WindowResized>()),
set_transform set_transform
.after(game::update_board::<Piece2d>) .after(game::update_board::<Display2d>)
.run_if(any_component_changed::<BoardIndex>), .run_if(any_component_changed::<BoardIndex>),
set_piece_sprite.run_if(any_component_changed::<Side>), set_piece_sprite.run_if(any_component_changed::<Side>),
set_tile_sprite.run_if(any_component_added::<Tile>), set_tile_sprite.run_if(any_component_added::<game::Tile>),
), ),
) )
.add_systems(OnEnter(GameState::Display2d), activate::<Display2d>) .add_systems(OnEnter(GameState::Display2d), activate::<Display2d>)
@ -64,14 +64,7 @@ struct SpriteSheet {
/// Marker component for the 2d entitys /// Marker component for the 2d entitys
#[derive(Debug, Component)] #[derive(Debug, Component)]
struct Display2d; pub(crate) struct Display2d;
/// Marker for 2d piece entities
#[derive(Debug, Component)]
pub(crate) struct Piece2d;
#[derive(Debug, Component)]
struct Tile2d;
#[derive(Debug, Component)] #[derive(Debug, Component)]
struct BackgroundImage; struct BackgroundImage;
@ -117,6 +110,7 @@ fn set_background(
) { ) {
commands.spawn(( commands.spawn((
BackgroundImage, BackgroundImage,
Display2d,
SpriteBundle { SpriteBundle {
texture: server.load("images/mars-daybreak.png"), texture: server.load("images/mars-daybreak.png"),
sprite: Sprite { sprite: Sprite {
@ -172,7 +166,7 @@ fn initialize_board(board: Option<Res<Board>>, mut commands: Commands) {
let s = (x % 2) ^ (y % 2); let s = (x % 2) ^ (y % 2);
let tile = if s == 0 { Tile::Dark } else { Tile::Light }; 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 // Spawn pieces
@ -181,7 +175,7 @@ fn initialize_board(board: Option<Res<Board>>, mut commands: Commands) {
parent.spawn(( parent.spawn((
piece.clone(), piece.clone(),
Piece2d, Display2d,
index.clone(), index.clone(),
side, side,
SpriteSheetBundle { ..default() }, SpriteSheetBundle { ..default() },
@ -199,7 +193,7 @@ fn set_piece_sprite(
&Piece, &Piece,
&Side, &Side,
), ),
Or<(Added<Piece>, Changed<Side>)>, (With<Display2d>, Or<(Added<Piece>, Changed<Side>)>),
>, >,
sprite_sheet: Option<Res<SpriteSheet>>, sprite_sheet: Option<Res<SpriteSheet>>,
) { ) {
@ -226,7 +220,10 @@ fn set_piece_sprite(
} }
fn set_tile_sprite( fn set_tile_sprite(
mut events: Query<(&mut TextureAtlasSprite, &mut Handle<TextureAtlas>, &Tile), Added<Tile2d>>, mut events: Query<
(&mut TextureAtlasSprite, &mut Handle<TextureAtlas>, &Tile),
(Added<game::Tile>, With<Display2d>),
>,
sprite_sheet: Option<Res<SpriteSheet>>, sprite_sheet: Option<Res<SpriteSheet>>,
) { ) {
if let Some(sprite_sheet) = sprite_sheet { if let Some(sprite_sheet) = sprite_sheet {
@ -248,7 +245,7 @@ fn set_transform(
mut events: Query< mut events: Query<
(&mut Transform, &BoardIndex), (&mut Transform, &BoardIndex),
( (
Or<(With<Piece2d>, With<Tile2d>)>, With<Display2d>,
Or<(Changed<BoardIndex>, Added<BoardIndex>)>, Or<(Changed<BoardIndex>, Added<BoardIndex>)>,
), ),
>, >,
@ -309,7 +306,7 @@ fn active_tile(
fn select_piece( fn select_piece(
mut events: EventReader<MouseButtonInput>, mut events: EventReader<MouseButtonInput>,
pieces: Query<(Entity, &BoardIndex), With<Piece2d>>, pieces: Query<(Entity, &BoardIndex), (With<game::Piece>, With<Display2d>)>,
active: Res<ActiveTile>, active: Res<ActiveTile>,
mut commands: Commands, mut commands: Commands,
mut writer: EventWriter<game::GameEvent>, mut writer: EventWriter<game::GameEvent>,
@ -334,7 +331,7 @@ fn select_piece(
fn move_piece( fn move_piece(
window: Query<&Window, With<PrimaryWindow>>, window: Query<&Window, With<PrimaryWindow>>,
mut query: Query<&mut Transform, (With<game::Selected>, With<Piece2d>)>, mut query: Query<&mut Transform, (With<game::Selected>, With<game::Piece>, With<Display2d>)>,
camera_query: Query<(&Camera, &GlobalTransform), With<Display2d>>, camera_query: Query<(&Camera, &GlobalTransform), With<Display2d>>,
) { ) {
query.iter_mut().for_each(|mut t| { query.iter_mut().for_each(|mut t| {
@ -355,8 +352,11 @@ fn move_piece(
/// ///
fn place_piece( fn place_piece(
mut events: EventReader<MouseButtonInput>, mut events: EventReader<MouseButtonInput>,
current: Query<(Entity, &BoardIndex), (With<game::Selected>, With<Piece2d>)>, current: Query<
pieces: Query<&BoardIndex, (Without<game::Selected>, With<Piece2d>)>, (Entity, &BoardIndex),
(With<game::Selected>, With<game::Piece>, With<Display2d>),
>,
pieces: Query<&BoardIndex, (Without<game::Selected>, With<game::Piece>, With<Display2d>)>,
active: Res<ActiveTile>, active: Res<ActiveTile>,
mut board: ResMut<Board>, mut board: ResMut<Board>,
mut commands: Commands, mut commands: Commands,
@ -373,11 +373,15 @@ fn place_piece(
} }
}) })
.filter_map(|idx| { .filter_map(|idx| {
if !current.is_empty() {
(!pieces.iter().any(|board_index| board_index == idx)).then_some(( (!pieces.iter().any(|board_index| board_index == idx)).then_some((
current.single().0, current.single().0,
current.single().1, current.single().1,
idx, idx,
)) ))
} else {
None
}
}) })
.for_each(|(entity, from, to)| match board.move_piece(from, to) { .for_each(|(entity, from, to)| match board.move_piece(from, to) {
Ok(moves) => { Ok(moves) => {
@ -395,7 +399,7 @@ fn place_piece(
fn cancel_place( fn cancel_place(
mut events: EventReader<MouseButtonInput>, mut events: EventReader<MouseButtonInput>,
current: Query<Entity, (With<game::Selected>, With<Piece2d>)>, current: Query<Entity, (With<game::Selected>, With<game::Piece>, With<Display2d>)>,
mut commands: Commands, mut commands: Commands,
mut writer: EventWriter<game::GameEvent>, mut writer: EventWriter<game::GameEvent>,
) { ) {
@ -414,7 +418,7 @@ fn cancel_place(
fn snap_back_cancel( fn snap_back_cancel(
mut events: RemovedComponents<game::Selected>, mut events: RemovedComponents<game::Selected>,
query: Query<&game::BoardIndex, With<Piece2d>>, query: Query<&game::BoardIndex, (With<game::Piece>, With<Display2d>)>,
mut move_events: EventWriter<game::Move>, mut move_events: EventWriter<game::Move>,
) { ) {
events.iter().for_each(|entity| { events.iter().for_each(|entity| {

@ -22,8 +22,8 @@ impl Plugin for Display3dPlugin {
Update, Update,
( (
menu::exit_to_menu.run_if(in_state(GameState::Display3d)), menu::exit_to_menu.run_if(in_state(GameState::Display3d)),
set_piece_model.run_if(any_component_added::<Piece3d>), set_piece_model.run_if(any_component_added::<Piece>),
set_board_model.run_if(any_component_added::<Board3d>), set_board_model.run_if(any_component_added::<game::BoardComponent>),
set_piece_position.run_if(any_component_changed::<BoardIndex>), set_piece_position.run_if(any_component_changed::<BoardIndex>),
set_piece_texture.run_if(any_component_changed::<Side>), set_piece_texture.run_if(any_component_changed::<Side>),
select_3d select_3d
@ -54,13 +54,7 @@ impl Plugin for Display3dPlugin {
} }
#[derive(Debug, Component)] #[derive(Debug, Component)]
struct Display3d; pub(crate) struct Display3d;
#[derive(Debug, Component)]
pub(crate) struct Piece3d;
#[derive(Debug, Component)]
pub(crate) struct Board3d;
#[derive(Debug, Resource)] #[derive(Debug, Resource)]
struct AssetsMap { struct AssetsMap {
@ -127,14 +121,14 @@ fn initialize(mut commands: Commands, board: Res<game::Board>, assets: Res<Asset
info!("Intializing 3D Board!"); info!("Intializing 3D Board!");
parent parent
.spawn((Display3d, Board3d, SceneBundle { ..default() })) .spawn((Display3d, game::BoardComponent, SceneBundle { ..default() }))
.with_children(|parent| { .with_children(|parent| {
board.pieces().iter().for_each(|(index, piece)| { board.pieces().iter().for_each(|(index, piece)| {
let side = Board::side(index).expect("Spawn valid side"); let side = Board::side(index).expect("Spawn valid side");
parent.spawn(( parent.spawn((
side, side,
Piece3d, Display3d,
piece.clone(), piece.clone(),
index.clone(), index.clone(),
SceneBundle { ..default() }, SceneBundle { ..default() },
@ -162,7 +156,7 @@ fn fix_skybox(mut images: ResMut<Assets<Image>>, assets: Res<AssetsMap>) {
/// Set the model for each piece based on the game::Piece::* marker /// Set the model for each piece based on the game::Piece::* marker
fn set_piece_model( fn set_piece_model(
mut events: Query<(&mut Handle<Scene>, &Piece), Added<Piece3d>>, mut events: Query<(&mut Handle<Scene>, &Piece), (Added<game::Piece>, With<Display3d>)>,
assets_map: Res<AssetsMap>, assets_map: Res<AssetsMap>,
gltfs: Res<Assets<Gltf>>, gltfs: Res<Assets<Gltf>>,
) { ) {
@ -179,7 +173,7 @@ fn set_piece_model(
} }
fn set_board_model( fn set_board_model(
mut events: Query<&mut Handle<Scene>, With<Board3d>>, mut events: Query<&mut Handle<Scene>, (With<game::BoardComponent>, With<Display3d>)>,
assets_map: Res<AssetsMap>, assets_map: Res<AssetsMap>,
gltfs: Res<Assets<Gltf>>, gltfs: Res<Assets<Gltf>>,
) { ) {
@ -195,7 +189,10 @@ fn set_board_model(
/// Sets a piece location given it's board index /// Sets a piece location given it's board index
fn set_piece_position( fn set_piece_position(
mut events: Query<(&mut Transform, &BoardIndex), (With<Piece3d>, Changed<BoardIndex>)>, mut events: Query<
(&mut Transform, &BoardIndex),
(With<game::Piece>, With<Display3d>, Changed<BoardIndex>),
>,
) { ) {
events.iter_mut().for_each(|(mut t, i)| { events.iter_mut().for_each(|(mut t, i)| {
t.translation = board_translation(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. /// 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. /// CAVEAT: We are only exeucting this when a piece changes or state is changed.
fn set_piece_texture( fn set_piece_texture(
events: Query<(Entity, &Piece, &Side), (With<Piece3d>, Changed<Side>)>, events: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>, Changed<Side>)>,
all: Query<(Entity, &Piece, &Side), With<Piece3d>>, all: Query<(Entity, &Piece, &Side), (With<game::Piece>, With<Display3d>)>,
gltfs: Res<Assets<Gltf>>, gltfs: Res<Assets<Gltf>>,
assets_map: Res<AssetsMap>, assets_map: Res<AssetsMap>,
children: Query<&Children>, children: Query<&Children>,
@ -377,16 +374,17 @@ fn set_piece_texture(
} }
/// Function for selecting entities based on ray intersection /// Function for selecting entities based on ray intersection
/// There is a bug where we are selecting multiple entities...
fn select_3d( fn select_3d(
mut events: EventReader<MouseButtonInput>, mut events: EventReader<MouseButtonInput>,
query: Query<(Entity, &Handle<Mesh>, &GlobalTransform)>, query: Query<(Entity, &Handle<Mesh>, &GlobalTransform)>,
meshes: Res<Assets<Mesh>>, meshes: Res<Assets<Mesh>>,
cameras: Query<(&Camera, &GlobalTransform)>, cameras: Query<(&Camera, &GlobalTransform), With<Display3d>>,
windows: Query<&Window, With<PrimaryWindow>>, windows: Query<&Window, With<PrimaryWindow>>,
parents: Query<Entity, (With<Piece3d>, Without<game::Selected>)>, parents: Query<Entity, (With<game::Piece>, With<Display3d>)>,
children: Query<&Children>, children: Query<&Children>,
mut commands: Commands, mut commands: Commands,
selected: Query<Entity, (With<game::Selected>, With<Piece3d>)>, selected: Query<Entity, (With<game::Selected>, With<game::Piece>, With<Display3d>)>,
) { ) {
events events
.iter() .iter()
@ -412,9 +410,12 @@ fn select_3d(
}) })
.iter() .iter()
.for_each(|&parent| { .for_each(|&parent| {
// TODO: Only remove/insert component if different
selected.iter().for_each(|s| { selected.iter().for_each(|s| {
commands.entity(s).remove::<game::Selected>(); if s != parent {
commands
.entity(s)
.remove::<game::Selected>();
}
}); });
commands.entity(parent).insert(game::Selected); commands.entity(parent).insert(game::Selected);
}); });
@ -431,10 +432,21 @@ fn select_3d(
} }
fn selected_gizmo( fn selected_gizmo(
selected: Query<&Transform, (With<game::Selected>, With<Piece3d>)>, selected: Query<&Transform, (With<game::Selected>, With<game::Piece>, With<Display3d>)>,
mut gizmos: Gizmos, mut gizmos: Gizmos,
) { ) {
selected.iter().for_each(|transform| { selected.iter().for_each(|transform| {
gizmos.cuboid(transform.clone(), Color::GREEN); gizmos.cuboid(transform.clone(), Color::GREEN);
}) })
} }
// Animations
// * QueenPickup
// * QueenPutDown
// * QueenIdle
// * DronePickup
// * DronePutDown
// * DroneIdle
// * PawnPickup
// * PawnPutDown
// * PawnIdle

@ -11,8 +11,8 @@ impl Plugin for GamePlugin {
.add_systems( .add_systems(
Update, Update,
( (
update_board::<display2d::Piece2d>.run_if(on_event::<Move>()), update_board::<display2d::Display2d>.run_if(on_event::<Move>()),
update_board::<display3d::Piece3d>.run_if(on_event::<Move>()), update_board::<display3d::Display3d>.run_if(on_event::<Move>()),
set_side.run_if(on_event::<Move>()), // TODO: correct run_if? set_side.run_if(on_event::<Move>()), // TODO: correct run_if?
), ),
) )
@ -39,6 +39,9 @@ pub(crate) enum Tile {
Light, Light,
} }
#[derive(Debug, Component)]
pub(crate) struct BoardComponent;
// manually for the type. // manually for the type.
impl std::fmt::Display for Piece { impl std::fmt::Display for Piece {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
@ -266,7 +269,7 @@ fn debug_board(board: Res<Board>, mut debug_info: ResMut<debug::DebugInfo>) {
/// Only update the tiles without a corresponding board piece /// Only update the tiles without a corresponding board piece
pub(crate) fn update_board<T: Component>( pub(crate) fn update_board<T: Component>(
mut events: EventReader<Move>, mut events: EventReader<Move>,
mut pieces: Query<(Entity, &mut BoardIndex), With<T>>, mut pieces: Query<(Entity, &mut BoardIndex), (With<Piece>, With<T>)>,
mut commands: Commands, mut commands: Commands,
) { ) {
events.iter().for_each(|Move { from, to, .. }| { events.iter().for_each(|Move { from, to, .. }| {

Loading…
Cancel
Save