diff --git a/crates/border-wars/src/map/selection.rs b/crates/border-wars/src/map/selection.rs index 918ac88..41c8aa3 100644 --- a/crates/border-wars/src/map/selection.rs +++ b/crates/border-wars/src/map/selection.rs @@ -16,6 +16,11 @@ pub struct TileJustClicked(pub u32); #[derive(Event)] struct ClickOnTheWorld(Vec2); +/// A zone that can't be clicked. +/// For exemple the UI of the game. +#[derive(Component)] +pub struct ZoneNotClickable; + /// A plugin that handles the selection of tiles. pub struct SelectorPlugin; @@ -35,20 +40,29 @@ fn mouse_handler( windows: Query<&Window>, cameras: Query<(&Camera, &GlobalTransform)>, mut events_writer: EventWriter, + not_clickable_zones: Query<(&Node, &GlobalTransform), With>, + ui_scale: Res, + ) { if !mouse_button_input.just_pressed(MouseButton::Left) { return; } - let cursor_position_on_screen = windows - .get_single() - .expect("Main window not found") - .cursor_position(); + let window = windows.get_single().expect("Main window not found"); + + let cursor_position_on_screen = window.cursor_position(); let Some(cursor_position_on_screen) = cursor_position_on_screen else { return; }; + for (node, global_transform) in not_clickable_zones.iter() { + let rect = node.physical_rect(global_transform, window.scale_factor(), ui_scale.0); + if rect.contains(cursor_position_on_screen) { + return; + } + } + let (camera, camera_transform) = cameras.get_single().expect("Camera not found"); let cursor_position_in_world = camera