From 86e47a79dee7fd1074a5f12257c2becb9f70e8a4 Mon Sep 17 00:00:00 2001 From: CoCo_Sol007 Date: Sun, 10 Mar 2024 18:52:08 +0100 Subject: [PATCH] help me --- crates/border-wars/src/main.rs | 15 ++++++------ crates/border-wars/src/map/click_tile.rs | 31 ++++++++++++------------ crates/border-wars/src/map/hex.rs | 31 ++++++++++++++++++++++++ crates/border-wars/src/map/renderer.rs | 4 +-- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index 54b85f3..8058057 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -28,17 +28,16 @@ fn start(mut event: EventWriter) { }); } -fn update(mut event: EventReader, query: Query<(Entity, &Tile)>) { +fn update( + mut commands: Commands, + mut event: EventReader, + query: Query<(Entity, &Tile)>, +) { for event in event.read() { for (entity, tile) in query.iter() { if entity.index() == event.0 { - - - - println!("Tile clicked: {:?}", tile); - + commands.entity(entity).despawn(); + } } } - } -} \ No newline at end of file diff --git a/crates/border-wars/src/map/click_tile.rs b/crates/border-wars/src/map/click_tile.rs index fb66845..a9aee9f 100644 --- a/crates/border-wars/src/map/click_tile.rs +++ b/crates/border-wars/src/map/click_tile.rs @@ -2,7 +2,8 @@ use bevy::prelude::*; -use super::Tile; +use super::renderer::TilesGap; +use super::{Tile, TilePosition}; /// The event that is triggered when a tile is clicked. /// @@ -75,31 +76,31 @@ fn mouse_handler( /// Get the closest tile to the cursor and send it in an event. fn select_closest_tile( - tiles: Query<(Entity, &Transform, &Tile)>, + tiles: Query<(Entity, &Transform, &Tile, &TilePosition)>, mut click_event_reader: EventReader, mut clicked_tile_event_writer: EventWriter, + gap_size: 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; - for (tile_entity, tile_transform, tile_type) in tiles.iter() { - let mut tile_position = tile_transform.translation.truncate(); + for (tile_entity, tile_transform, tile_type, tile_pos) in tiles.iter() { + + let mut pos = click_event.0; + + // because the origin of tiles is the bottom center let tile_size = tile_type.get_image_size(); let tile_scale = tile_transform.scale.truncate(); + pos.y -= (tile_size.y / 2.0) * tile_scale.y; - tile_position += (tile_size / 2.0) * tile_scale; + // + pos /= gap_size.0; - let distance_to_cursor = tile_position.distance(click_event.0); + let hex_pos = TilePosition::from_pixel_coordinates(pos); - if closest_position.is_none() || closest_position > Some(distance_to_cursor) { - closest_entity = Some(tile_entity); - closest_position = Some(distance_to_cursor); + if *tile_pos == hex_pos { + clicked_tile_event_writer.send(TileJustClicked(tile_entity.index())); + break; } } - if let Some(tile_entity) = closest_entity { - clicked_tile_event_writer.send(TileJustClicked(tile_entity.index())); - } } } diff --git a/crates/border-wars/src/map/hex.rs b/crates/border-wars/src/map/hex.rs index 415bdfc..54c2c4b 100644 --- a/crates/border-wars/src/map/hex.rs +++ b/crates/border-wars/src/map/hex.rs @@ -262,6 +262,37 @@ impl HexPosition { ) } + + /// doc : https://www.redblobgames.com/grids/hexagons/#rounding + fn axial_round(&self) -> Self { + let old_q = self.0; + let old_r = self.1; + let old_s = -old_q - old_r; + + let q = T::from_f32(old_q.to_f32().round()); + let r = T::from_f32(old_r.to_f32().round()); + let s = T::from_f32(old_s.to_f32().round()); + + let q_diff = (q - old_q).abs(); + let r_diff = (r - old_r).abs(); + let s_diff = (s - old_s).abs(); + + if q_diff > r_diff && q_diff > s_diff { + Self(-r - s, r) + } else if r_diff > s_diff { + Self(q, -q - s) + } else { + Self(q, r) + } + } + + /// doc : https://www.redblobgames.com/grids/hexagons/#pixel-to-hex + pub fn from_pixel_coordinates(pixel: Vec2) -> Self { + let q = ((3_f32.sqrt() / 3.0) * pixel.x) - ((1. / 3.) * pixel.y); + let r = (2.0 / 3.0) * pixel.y; + Self(T::from_f32(q), T::from_f32(r)).axial_round() + } + /// Returns the distance between two [HexPosition]s. /// /// # How it works 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,