Path: blob/main/examples/ui/relative_cursor_position.rs
6595 views
//! Showcases the [`RelativeCursorPosition`] component, used to check the position of the cursor relative to a UI node.12use bevy::{camera::Viewport, prelude::*, ui::RelativeCursorPosition};34fn main() {5App::new()6.add_plugins(DefaultPlugins)7.add_systems(Startup, setup)8.add_systems(Update, relative_cursor_position_system)9.run();10}1112fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {13commands.spawn((14Camera2d,15Camera {16// Cursor position will take the viewport offset into account17viewport: Some(Viewport {18physical_position: [200, 100].into(),19physical_size: [600, 600].into(),20..default()21}),22..default()23},24));2526commands27.spawn(Node {28width: percent(100),29height: percent(100),30align_items: AlignItems::Center,31justify_content: JustifyContent::Center,32flex_direction: FlexDirection::Column,33..default()34})35.with_children(|parent| {36parent37.spawn((38Node {39width: px(250),40height: px(250),41margin: UiRect::bottom(px(15)),42..default()43},44BackgroundColor(Color::srgb(0.92, 0.14, 0.05)),45))46.insert(RelativeCursorPosition::default());4748parent.spawn((49Text::new("(0.0, 0.0)"),50TextFont {51font: asset_server.load("fonts/FiraSans-Bold.ttf"),52font_size: 33.0,53..default()54},55TextColor(Color::srgb(0.9, 0.9, 0.9)),56));57});58}5960/// This systems polls the relative cursor position and displays its value in a text component.61fn relative_cursor_position_system(62relative_cursor_position: Single<&RelativeCursorPosition>,63output_query: Single<(&mut Text, &mut TextColor)>,64) {65let (mut output, mut text_color) = output_query.into_inner();6667**output = if let Some(relative_cursor_position) = relative_cursor_position.normalized {68format!(69"({:.1}, {:.1})",70relative_cursor_position.x, relative_cursor_position.y71)72} else {73"unknown".to_string()74};7576text_color.0 = if relative_cursor_position.cursor_over() {77Color::srgb(0.1, 0.9, 0.1)78} else {79Color::srgb(0.9, 0.1, 0.1)80};81}828384