make a few block, just follow the cursor if selected

This commit is contained in:
OMGeeky
2025-04-13 16:18:07 +02:00
parent 8fce91e744
commit 68c6bec9dd

View File

@@ -1,3 +1,4 @@
use bevy::color::palettes::basic::{RED, WHITE};
use bevy::prelude::*;
mod fps_counter;
@@ -6,55 +7,114 @@ fn main() {
.add_plugins((
DefaultPlugins,
fps_counter::FpsCounterPlugin,
MeshPickingPlugin,
))
.add_systems(Startup, setup)
.add_systems(Startup, change_window_mode)
// .add_systems(Update, switch_focused_shape)
.add_systems(Update, show_focused_shape)
.add_systems(FixedUpdate, focused_follow_cursor)
.add_systems(Update, draw_cursor)
.run();
}
//region first app
//region system
fn hello_world() {
println!("hello world!");
}
//endregion
//region component
#[derive(Component)]
struct Person;
fn change_window_mode(mut windows: Query<&mut Window>) {
let mut window = windows.single_mut();
// window.mode = WindowMode::Fullscreen(MonitorSelection::Current);
window.present_mode = bevy::window::PresentMode::AutoNoVsync;
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
commands.spawn(Camera2d);
let shapes = [
meshes.add(Rectangle::new(50.0, 100.0)),
meshes.add(Rectangle::new(100.0, 50.0)),
];
let num_shapes = shapes.len();
for (i, shape) in shapes.into_iter().enumerate() {
commands
.spawn((
Mesh2d(shape),
MeshMaterial2d(materials.add(Color::from(RED))),
Focused(true),
Transform::from_xyz((i as f32 - num_shapes as f32 / 2.0) * 150.0, 0.0, 0.0),
))
.observe(on_click_shape);
}
}
fn draw_cursor(
camera_query: Single<(&Camera, &GlobalTransform)>,
windows: Query<&Window>,
mut gizmos: Gizmos,
) {
let Some(point) = get_cursor_worl_pos(camera_query, windows) else {
return;
};
gizmos.circle_2d(point, 10.0, WHITE);
}
fn get_cursor_worl_pos(
camera_query: Single<(&Camera, &GlobalTransform)>,
windows: Query<&Window>,
) -> Option<Vec2> {
let (camera, camera_transform) = *camera_query;
let Ok(window) = windows.get_single() else {
return None;
};
let Some(cursor_position) = window.cursor_position() else {
return None;
};
let Ok(point) = camera.viewport_to_world_2d(camera_transform, cursor_position) else {
return None;
};
Some(point)
}
#[derive(Component)]
struct Name(String);
fn add_people(mut commands: Commands) {
commands.spawn((Person, Name("Elaina Proctor".to_string())));
commands.spawn((Person, Name("Renzo Hume".to_string())));
commands.spawn((Person, Name("Zayna Nieves".to_string())));
}
#[derive(Resource)]
struct GreetTimer(Timer);
//endregion
//region query
fn greet_people(time: Res<Time>, mut timer: ResMut<GreetTimer>, query: Query<&Name, With<Person>>) {
if timer.0.tick(time.delta()).just_finished() {
for name in &query {
println!("hello {}!", name.0);
struct Focused(bool);
fn show_focused_shape(focused: Query<(&Focused, &GlobalTransform)>, mut gizmos: Gizmos) {
for (focused, transform) in focused.iter() {
let point: Vec2 = transform.translation().xy();
if focused.0 {
gizmos.circle_2d(point, 10.0, WHITE);
}
}
}
fn update_people(mut query: Query<&mut Name, With<Person>>) {
for mut name in &mut query {
if name.0 == "Elaina Proctor" {
name.0 = "Elaina Hume".to_string();
break;
fn focused_follow_cursor(
time: Res<Time<Fixed>>,
mut focused: Query<(&Focused, &mut Transform)>,
camera_query: Single<(&Camera, &GlobalTransform)>,
windows: Query<&Window>,
) {
let Some(point) = get_cursor_worl_pos(camera_query, windows) else {
return;
};
const MOVEMENT_SPEED: f32 = 100.0;
for (focused, mut transform) in focused.iter_mut() {
if focused.0 {
let move_vec = point - transform.translation.xy();
if move_vec.length_squared() < 0.0001 {
continue;
}
let capped_move_vec = move_vec.normalize() * time.delta_secs() * MOVEMENT_SPEED;
if capped_move_vec.length_squared() > move_vec.length_squared() {
transform.translation += move_vec.extend(0.0);
continue;
}
transform.translation += capped_move_vec.extend(0.0);
}
}
}
//endregion
//region Plugin
pub struct HelloPlugin;
impl Plugin for HelloPlugin {
fn build(&self, app: &mut App) {
app.insert_resource(GreetTimer(Timer::from_seconds(2.0, TimerMode::Repeating)))
.add_systems(Startup, add_people)
.add_systems(Update, ((update_people, greet_people).chain()));
}
fn on_click_shape(click: Trigger<Pointer<Click>>, mut focused: Query<&mut Focused>) {
let Ok(mut focused) = focused.get_mut(click.entity()) else {
return;
};
focused.0 = !focused.0;
}
//endregion
//endregion