From 907f217058b6261137085236456d2db4025cbab5 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Sun, 10 Mar 2024 21:52:43 +0100 Subject: [PATCH 01/14] update --- crates/border-wars/src/map/click_tile.rs | 12 +++++++++--- crates/border-wars/src/map/renderer.rs | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/crates/border-wars/src/map/click_tile.rs b/crates/border-wars/src/map/click_tile.rs index fb66845..1bfd88e 100644 --- a/crates/border-wars/src/map/click_tile.rs +++ b/crates/border-wars/src/map/click_tile.rs @@ -2,6 +2,7 @@ use bevy::prelude::*; +use super::renderer::TilesGap; use super::Tile; /// The event that is triggered when a tile is clicked. @@ -78,20 +79,25 @@ fn select_closest_tile( tiles: Query<(Entity, &Transform, &Tile)>, mut click_event_reader: EventReader, mut clicked_tile_event_writer: EventWriter, + gap_tiles: Res, ) { for click_event in click_event_reader.read() { // The closest tile and its distance to the cursor. let mut closest_entity: Option = None; let mut closest_position: Option = None; + // To keep the aspect ratio. + let click_position = click_event.0 / gap_tiles.0; + for (tile_entity, tile_transform, tile_type) in tiles.iter() { - let mut tile_position = tile_transform.translation.truncate(); let tile_size = tile_type.get_image_size(); let tile_scale = tile_transform.scale.truncate(); - tile_position += (tile_size / 2.0) * tile_scale; + let mut tile_position = tile_transform.translation.truncate() / gap_tiles.0; + // The origine of the tile is the bottom center. + tile_position.y += (tile_size.y / 2.0) * tile_scale.y / gap_tiles.0.y; - let distance_to_cursor = tile_position.distance(click_event.0); + let distance_to_cursor = tile_position.distance(click_position); if closest_position.is_none() || closest_position > Some(distance_to_cursor) { closest_entity = Some(tile_entity); diff --git a/crates/border-wars/src/map/renderer.rs b/crates/border-wars/src/map/renderer.rs index 55fa90f..0119f72 100644 --- a/crates/border-wars/src/map/renderer.rs +++ b/crates/border-wars/src/map/renderer.rs @@ -21,7 +21,7 @@ impl Plugin for RendererPlugin { /// The gap between the center of the tiles in the map. #[derive(Resource)] -struct TilesGap(Vec2); +pub struct TilesGap(pub Vec2); /// The size of the tiles in the map. #[derive(Resource, Clone, Copy)] @@ -81,7 +81,7 @@ fn render_map( commands.entity(entity).insert(SpriteBundle { sprite: Sprite { - anchor: Anchor::BottomLeft, + anchor: Anchor::BottomCenter, ..default() }, texture, -- 2.43.4 From bb0b7a82e06526777edca6aa274d56b581047c5a Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:31:18 +0100 Subject: [PATCH 02/14] save --- crates/border-wars/src/map/mod.rs | 2 +- .../map/{click_tile.rs => selected_tile.rs} | 42 ++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) rename crates/border-wars/src/map/{click_tile.rs => selected_tile.rs} (76%) diff --git a/crates/border-wars/src/map/mod.rs b/crates/border-wars/src/map/mod.rs index 9172176..6791328 100644 --- a/crates/border-wars/src/map/mod.rs +++ b/crates/border-wars/src/map/mod.rs @@ -1,9 +1,9 @@ //! Contains all the logic related to the map. -pub mod click_tile; pub mod generation; pub mod hex; pub mod renderer; +pub mod selected_tile; use bevy::prelude::*; diff --git a/crates/border-wars/src/map/click_tile.rs b/crates/border-wars/src/map/selected_tile.rs similarity index 76% rename from crates/border-wars/src/map/click_tile.rs rename to crates/border-wars/src/map/selected_tile.rs index 1bfd88e..432711a 100644 --- a/crates/border-wars/src/map/click_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -22,6 +22,28 @@ struct ClickOnTheWorld(Vec2); #[derive(Component)] pub struct ZoneNotClickable; +/// The currently selected tile. +#[derive(Resource, Default, Debug)] +pub enum SelectedTile { + /// The index (ID) of the selected tile. + Tile(u32), + + /// Any tile is selected. + #[default] + None, +} + +impl SelectedTile { + /// Returns the index (ID) of the selected tile. + /// Returns `None` if no tile is selected. + pub fn index(&self) -> Option { + match self { + SelectedTile::Tile(index) => Some(*index), + SelectedTile::None => None, + } + } +} + /// A plugin that handles the selection of tiles. pub struct TilesClickable; @@ -30,7 +52,8 @@ impl Plugin for TilesClickable { app.add_systems(PreUpdate, mouse_handler) .add_systems(PreUpdate, select_closest_tile) .add_event::() - .add_event::(); + .add_event::() + .init_resource::(); } } @@ -79,7 +102,8 @@ fn select_closest_tile( tiles: Query<(Entity, &Transform, &Tile)>, mut click_event_reader: EventReader, mut clicked_tile_event_writer: EventWriter, - gap_tiles: Res, + tile_gap: Res, + mut selected_tile: ResMut, ) { for click_event in click_event_reader.read() { // The closest tile and its distance to the cursor. @@ -87,15 +111,15 @@ fn select_closest_tile( let mut closest_position: Option = None; // To keep the aspect ratio. - let click_position = click_event.0 / gap_tiles.0; + let click_position = click_event.0 / tile_gap.0; for (tile_entity, tile_transform, tile_type) in tiles.iter() { let tile_size = tile_type.get_image_size(); let tile_scale = tile_transform.scale.truncate(); - let mut tile_position = tile_transform.translation.truncate() / gap_tiles.0; + let mut tile_position = tile_transform.translation.truncate() / tile_gap.0; // The origine of the tile is the bottom center. - tile_position.y += (tile_size.y / 2.0) * tile_scale.y / gap_tiles.0.y; + tile_position.y += (tile_size.y / 2.0) * tile_scale.y / tile_gap.0.y; let distance_to_cursor = tile_position.distance(click_position); @@ -105,7 +129,13 @@ fn select_closest_tile( } } if let Some(tile_entity) = closest_entity { - clicked_tile_event_writer.send(TileJustClicked(tile_entity.index())); + let entity_index = tile_entity.index(); + clicked_tile_event_writer.send(TileJustClicked(entity_index)); + if selected_tile.index() == Some(entity_index) { + *selected_tile = SelectedTile::None; + } else { + *selected_tile = SelectedTile::Tile(entity_index); + } } } } -- 2.43.4 From 32624d0232a12a727435bad9f2a8264e29370fdd Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:32:35 +0100 Subject: [PATCH 03/14] chnage doc --- crates/border-wars/src/main.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index cc2c72e..1cfc5b6 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -2,8 +2,9 @@ use bevy::prelude::*; use border_wars::camera::CameraPlugin; -use border_wars::map::click_tile::TilesClickable; +use border_wars::map::generation::{MapGenerationPlugin, StartMapGeneration}; use border_wars::map::renderer::RendererPlugin; +use border_wars::map::selected_tile::TilesClickable; use border_wars::scenes::ScenesPlugin; fn main() { @@ -13,5 +14,14 @@ fn main() { .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) .add_plugins(TilesClickable) + .add_plugins(MapGenerationPlugin) + .add_systems(OnEnter(border_wars::CurrentScene::Game), start) .run(); } + +fn start(mut event: EventWriter) { + event.send(StartMapGeneration { + seed: 0, + radius: 10, + }); +} -- 2.43.4 From 61c56bcdcae02beb5b78a660968aa6689b31cc6d Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:37:33 +0100 Subject: [PATCH 04/14] save --- crates/border-wars/src/main.rs | 14 +------------- crates/border-wars/src/map/selected_tile.rs | 8 ++++---- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index 1cfc5b6..6194fab 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -2,9 +2,7 @@ use bevy::prelude::*; use border_wars::camera::CameraPlugin; -use border_wars::map::generation::{MapGenerationPlugin, StartMapGeneration}; use border_wars::map::renderer::RendererPlugin; -use border_wars::map::selected_tile::TilesClickable; use border_wars::scenes::ScenesPlugin; fn main() { @@ -13,15 +11,5 @@ fn main() { .add_plugins(ScenesPlugin) .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) - .add_plugins(TilesClickable) - .add_plugins(MapGenerationPlugin) - .add_systems(OnEnter(border_wars::CurrentScene::Game), start) .run(); -} - -fn start(mut event: EventWriter) { - event.send(StartMapGeneration { - seed: 0, - radius: 10, - }); -} +} \ No newline at end of file diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index 432711a..cd3b8fd 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -1,4 +1,4 @@ -//! All programs related to the clicking on a tile. +//! All programs related to the selection of a tile. use bevy::prelude::*; @@ -45,9 +45,9 @@ impl SelectedTile { } /// A plugin that handles the selection of tiles. -pub struct TilesClickable; +pub struct SelectTilePlugin; -impl Plugin for TilesClickable { +impl Plugin for SelectTilePlugin { fn build(&self, app: &mut App) { app.add_systems(PreUpdate, mouse_handler) .add_systems(PreUpdate, select_closest_tile) @@ -97,7 +97,7 @@ fn mouse_handler( events_writer.send(ClickOnTheWorld(cursor_position_in_world)); } -/// Get the closest tile to the cursor and send it in an event. +/// Get the closest tile to the cursor, send it in an event and select it. fn select_closest_tile( tiles: Query<(Entity, &Transform, &Tile)>, mut click_event_reader: EventReader, -- 2.43.4 From 6d66e67abe8f62cce504d0f487e0560c4fbf539f Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:38:46 +0100 Subject: [PATCH 05/14] save --- crates/border-wars/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index 6194fab..e9ca73b 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -3,6 +3,7 @@ use bevy::prelude::*; use border_wars::camera::CameraPlugin; use border_wars::map::renderer::RendererPlugin; +use border_wars::map::selected_tile::SelectTilePlugin; use border_wars::scenes::ScenesPlugin; fn main() { @@ -11,5 +12,6 @@ fn main() { .add_plugins(ScenesPlugin) .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) + .add_plugins(SelectTilePlugin) .run(); } \ No newline at end of file -- 2.43.4 From 5310e04f2e91fd19f4c0eaf65fd295d7d377e3d2 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:41:55 +0100 Subject: [PATCH 06/14] fmt --- crates/border-wars/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index e9ca73b..ac4d412 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -12,6 +12,6 @@ fn main() { .add_plugins(ScenesPlugin) .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) - .add_plugins(SelectTilePlugin) + .add_plugins(SelectTilePlugin) .run(); -} \ No newline at end of file +} -- 2.43.4 From 270e8c54d16e31e86ec8cc4e7af482a3079aaea0 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Mon, 11 Mar 2024 08:46:03 +0100 Subject: [PATCH 07/14] fix clippy --- crates/border-wars/src/map/selected_tile.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index cd3b8fd..cf81fab 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -36,10 +36,10 @@ pub enum SelectedTile { impl SelectedTile { /// Returns the index (ID) of the selected tile. /// Returns `None` if no tile is selected. - pub fn index(&self) -> Option { + pub const fn index(&self) -> Option { match self { - SelectedTile::Tile(index) => Some(*index), - SelectedTile::None => None, + Self::Tile(index) => Some(*index), + Self::None => None, } } } -- 2.43.4 From 419e36fb01f7f6c3e993b5f3ddcb250b8b161ae9 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 13 Mar 2024 07:23:57 +0100 Subject: [PATCH 08/14] update --- crates/border-wars/src/map/selected_tile.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index cf81fab..4fc4e5e 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -28,7 +28,7 @@ pub enum SelectedTile { /// The index (ID) of the selected tile. Tile(u32), - /// Any tile is selected. + /// Zero tile selected. #[default] None, } -- 2.43.4 From 9fe9e7fe2b20226cedbafe7e6f69e53accf9de29 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 13 Mar 2024 07:37:34 +0100 Subject: [PATCH 09/14] replace index for entity --- crates/border-wars/src/map/selected_tile.rs | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index 4fc4e5e..052a810 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -7,9 +7,9 @@ use super::Tile; /// The event that is triggered when a tile is clicked. /// -/// The event contains the index (ID) of the clicked tile. +/// The event contains the entity of the clicked tile. #[derive(Event)] -pub struct TileJustClicked(pub u32); +pub struct TileJustClicked(pub Entity); /// An event that is triggered when a mouse button is clicked. /// @@ -25,8 +25,8 @@ pub struct ZoneNotClickable; /// The currently selected tile. #[derive(Resource, Default, Debug)] pub enum SelectedTile { - /// The index (ID) of the selected tile. - Tile(u32), + /// The entity of the selected tile. + Tile(Entity), /// Zero tile selected. #[default] @@ -36,9 +36,9 @@ pub enum SelectedTile { impl SelectedTile { /// Returns the index (ID) of the selected tile. /// Returns `None` if no tile is selected. - pub const fn index(&self) -> Option { + pub const fn get_entity(&self) -> Option { match self { - Self::Tile(index) => Some(*index), + Self::Tile(entity) => Some(*entity), Self::None => None, } } @@ -103,7 +103,7 @@ fn select_closest_tile( mut click_event_reader: EventReader, mut clicked_tile_event_writer: EventWriter, tile_gap: Res, - mut selected_tile: ResMut, + mut current_entity: ResMut, ) { for click_event in click_event_reader.read() { // The closest tile and its distance to the cursor. @@ -129,12 +129,11 @@ fn select_closest_tile( } } if let Some(tile_entity) = closest_entity { - let entity_index = tile_entity.index(); - clicked_tile_event_writer.send(TileJustClicked(entity_index)); - if selected_tile.index() == Some(entity_index) { - *selected_tile = SelectedTile::None; + clicked_tile_event_writer.send(TileJustClicked(tile_entity.clone())); + if current_entity.get_entity() == Some(tile_entity) { + *current_entity = SelectedTile::None; } else { - *selected_tile = SelectedTile::Tile(entity_index); + *current_entity = SelectedTile::Tile(tile_entity); } } } -- 2.43.4 From e820a0e56c920dbe1a5ab6fb8278e2f61e97854e Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 13 Mar 2024 07:49:23 +0100 Subject: [PATCH 10/14] remove event --- crates/border-wars/src/map/selected_tile.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index 052a810..c6d1ce4 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -5,11 +5,6 @@ use bevy::prelude::*; use super::renderer::TilesGap; use super::Tile; -/// The event that is triggered when a tile is clicked. -/// -/// The event contains the entity of the clicked tile. -#[derive(Event)] -pub struct TileJustClicked(pub Entity); /// An event that is triggered when a mouse button is clicked. /// @@ -52,7 +47,6 @@ impl Plugin for SelectTilePlugin { app.add_systems(PreUpdate, mouse_handler) .add_systems(PreUpdate, select_closest_tile) .add_event::() - .add_event::() .init_resource::(); } } @@ -101,7 +95,6 @@ fn mouse_handler( fn select_closest_tile( tiles: Query<(Entity, &Transform, &Tile)>, mut click_event_reader: EventReader, - mut clicked_tile_event_writer: EventWriter, tile_gap: Res, mut current_entity: ResMut, ) { @@ -129,7 +122,6 @@ fn select_closest_tile( } } if let Some(tile_entity) = closest_entity { - clicked_tile_event_writer.send(TileJustClicked(tile_entity.clone())); if current_entity.get_entity() == Some(tile_entity) { *current_entity = SelectedTile::None; } else { -- 2.43.4 From 2a00b0f23871ea6223483c085eadc90c2584c81a Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 13 Mar 2024 07:50:51 +0100 Subject: [PATCH 11/14] fix fmt --- crates/border-wars/src/map/selected_tile.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index c6d1ce4..dd53bf5 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -5,7 +5,6 @@ use bevy::prelude::*; use super::renderer::TilesGap; use super::Tile; - /// An event that is triggered when a mouse button is clicked. /// /// The event contains the position of the cursor in the world. -- 2.43.4 From 3d25021fde78107ce53022f2f93cb4256542710a Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Wed, 13 Mar 2024 07:54:42 +0100 Subject: [PATCH 12/14] remove doc --- crates/border-wars/src/map/selected_tile.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index dd53bf5..7de28ef 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -90,7 +90,7 @@ fn mouse_handler( events_writer.send(ClickOnTheWorld(cursor_position_in_world)); } -/// Get the closest tile to the cursor, send it in an event and select it. +/// Get the closest tile to the cursor and select it. fn select_closest_tile( tiles: Query<(Entity, &Transform, &Tile)>, mut click_event_reader: EventReader, -- 2.43.4 From 7b348fa5b1aa1a0517c34286df641a134a9779fb Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Wed, 13 Mar 2024 14:19:39 +0000 Subject: [PATCH 13/14] change doc --- crates/border-wars/src/map/selected_tile.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index 7de28ef..b2c253d 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -28,7 +28,7 @@ pub enum SelectedTile { } impl SelectedTile { - /// Returns the index (ID) of the selected tile. + /// Returns the entity of the selected tile. /// Returns `None` if no tile is selected. pub const fn get_entity(&self) -> Option { match self { -- 2.43.4 From d3d2196abee8f7f2ca1e31b2e17f66ca1fb5f996 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Thu, 14 Mar 2024 16:52:59 +0000 Subject: [PATCH 14/14] Update crates/border-wars/src/map/selected_tile.rs --- crates/border-wars/src/map/selected_tile.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/border-wars/src/map/selected_tile.rs b/crates/border-wars/src/map/selected_tile.rs index b2c253d..2dcb0e4 100644 --- a/crates/border-wars/src/map/selected_tile.rs +++ b/crates/border-wars/src/map/selected_tile.rs @@ -98,7 +98,7 @@ fn select_closest_tile( mut current_entity: ResMut, ) { for click_event in click_event_reader.read() { - // The closest tile and its distance to the cursor. + // The closest tile and its position. let mut closest_entity: Option = None; let mut closest_position: Option = None; -- 2.43.4