From 7363ec9d39e35f4a49a428af1ff19123d757cc51 Mon Sep 17 00:00:00 2001 From: StephenAdamson Date: Fri, 13 Dec 2024 23:07:08 +0000 Subject: [PATCH] cursor ui --- assets/cursor.png | Bin 0 -> 4362 bytes src/citizen.rs | 2 +- src/constants.rs | 2 ++ src/cursor.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++++ src/game.rs | 7 +++---- src/main.rs | 36 ++++------------------------------- src/tiles.rs | 2 +- 7 files changed, 58 insertions(+), 38 deletions(-) create mode 100644 assets/cursor.png create mode 100644 src/constants.rs create mode 100644 src/cursor.rs diff --git a/assets/cursor.png b/assets/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..a44916695e784c52c03dfe16fa4a542b1f538737 GIT binary patch literal 4362 zcmeHKe{dAl9bYgc_H4i;PzXa{-B4*Xd$+syBX>J@#CUfkM{*Ftm4tvL?{?oMOYUxu zz0KVv6GK8A9fBgE72*#pq()PxjkXRBDKY|zXhkGQ6ezU`h*Bs?>o~Oe??BZi<0<+)1Z~ta6E0U1lG4K3lWu!S{Yv;MH!aa{V zG;_X=dCzZpKhyfufr>uQ((2O{Z~eKYcV-hP{4(XxQ0xAWE@#Ynr7^MfLE*W&%ZK}8 zDV;^fd$y*&=jv^j=WVX3@4m7lt-U_2du9vA_=lU*QvO6N{_1+mA6Iri5ZKTklro;* zX1Q8+-kSNV-M!wtKJU<_r_ONBn+_pco>|%OYP)cJAJJ4xEWYQr8P9JvM^+y&mfH`O zT;KJ@iDp}ei@JKf`JPj-Vc^q?J#&UWEALOv_<5x3k+jArhRt|Lu-l7WcKc}9DA;En zY_%1pSV~ zJ$7P!X;Nw4owu+pkx+@;n)>bDx#e%hLYE$oez`b0h#goDU%ZfZo98{|?Dj)#@4nR1 zRGN@-{LZ)Vf>Y;y`Q(Xg>&cI7_4P+~e4afR-nw&F36K%a=WCxVG)h$2abMpyA3!sjTlwkookp%VwwT=+N#t-1bEB6S0TQ?VSs+-eK80 z@AQUedN=PoIQY({1=&^irgwd?$T_pHfS8rST<_ekxnoVav83oZA$OpE$(CDL(mS8L z*x1U=Fm~=*l>470w+24UUbVX0b^L+!(m|H~r1w2COMn`rUrl!^x;TBLXVJGItTni2*I(MK9FG z0wGkN7-r3lg#cF#W!wuZg`kZXJp4L=3%rdeHM%Kx$PTN7f;tJVty|^c>Z&;lPvkDw zSYs>#2tXO&v4B4qW@9!&#bwc05$gzCRgtT0M47u7w~G?Q4O)YiBAqcI!Vt?fxK-kP zY>8vV2n71F5mmArVs*M`G^&m2wW3t1qb(MTj$(8SLm~|_TpN@@j0}b|6^J;71BN+C z2+4vN#1%~76>DT0L7;hj)W1N;?H+>#=zA@~ z9@Ndc5*QY1Bn~!9YN+}xRbO;V^@`tmfOubM6O10&*iWY%K9uXastn)LnEM# zKIr2~&cgUe15a}#&@*1r$e5u8`1CZL!%cv41;a83a!`Rn;93FU_`H+}T6jR_6eu1+<|Q2 zmK-Aop~1qaP&~)35TyV>=@bH>66!+1N_9dZoXsnC*$75UjZ2FCK=vU6)B{407o*|v zDUT3EM;VA^SuL@+4~R07X2=PY5xS9Jb;^!08m(3L9X_n8!h|gb*~MjO>q0xB zZfq+Y;S2ftL;gnc@Ix+v7 literal 0 HcmV?d00001 diff --git a/src/citizen.rs b/src/citizen.rs index 356eb48..9178e5b 100644 --- a/src/citizen.rs +++ b/src/citizen.rs @@ -1,4 +1,4 @@ -use crate::game::PIXEL_RATIO; +use crate::constants::*; use bevy::prelude::*; use rand::prelude::*; diff --git a/src/constants.rs b/src/constants.rs new file mode 100644 index 0000000..7a1f585 --- /dev/null +++ b/src/constants.rs @@ -0,0 +1,2 @@ +pub const PIXEL_RATIO: f32 = 4.0; +pub const TILE_SIZE: f32 = 16.0 * PIXEL_RATIO; diff --git a/src/cursor.rs b/src/cursor.rs new file mode 100644 index 0000000..98d96fe --- /dev/null +++ b/src/cursor.rs @@ -0,0 +1,47 @@ +use crate::constants::*; +use bevy::{prelude::*, winit::cursor}; + +#[derive(Component)] +#[require(Transform)] +pub struct Cursor { + id: f32, +} + +pub fn setup_curor(mut commands: Commands, asset_server: Res) { + commands.spawn(( + Transform::from_xyz(0., 0., 10.).with_scale(Vec3::splat(PIXEL_RATIO)), + Sprite { + image: asset_server.load("cursor.png"), + ..Default::default() + }, + Cursor { id: 1. }, + )); +} + +pub fn move_cursor( + camera_query: Single<(&Camera, &GlobalTransform)>, + windows: Query<&Window>, + mut query: Query<(&Cursor, &mut Transform), With>, +) { + for mut transform in query.iter_mut() { + let (camera, camera_transform) = *camera_query; + + let Ok(window) = windows.get_single() else { + return; + }; + + let Some(cursor_position) = window.cursor_position() else { + return; + }; + + // Calculate a world position based on the cursor's position. + let Ok(point) = camera.viewport_to_world_2d(camera_transform, cursor_position) else { + return; + }; + transform.1.translation = Vec3::new( + ((point.x / (TILE_SIZE)+0.5).floor()) * TILE_SIZE, + ((point.y / (TILE_SIZE)+0.5).floor()) * TILE_SIZE, + 100.0, + ); + } +} diff --git a/src/game.rs b/src/game.rs index 48ed35b..4c086a0 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,11 +1,10 @@ use crate::citizen::Citizen; use crate::item::{Item, ItemBundle}; use crate::tiles::TilePrefab; +use crate::constants::*; use bevy::prelude::*; use rand::prelude::*; -pub const PIXEL_RATIO: f32 = 4.0; - pub fn setup_level(mut commands: Commands, asset_server: Res) { setup_tilemap(&mut commands, &asset_server); @@ -26,8 +25,8 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { for y in -25..25 { for z in 0..4 { let position = Vec3::new( - x as f32 * 16. * PIXEL_RATIO, - y as f32 * 16. * PIXEL_RATIO, + x as f32 * TILE_SIZE, + y as f32 * TILE_SIZE, -z as f32, ); diff --git a/src/main.rs b/src/main.rs index 19b4b94..1bba431 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,13 @@ use bevy::prelude::*; +mod constants; mod camera; mod citizen; mod game; mod item; mod tile; mod tiles; - -use bevy::color::palettes::basic::WHITE; -use game::PIXEL_RATIO; +mod cursor; fn main() { App::new() @@ -25,6 +24,7 @@ fn main() { ) .insert_resource(ClearColor(Color::srgb(0.1, 0.1, 0.15))) .add_systems(Startup, (game::setup_level, camera::spawn_panning_camera)) + .add_systems(Startup, cursor::setup_curor) .add_systems( FixedUpdate, ( @@ -33,34 +33,6 @@ fn main() { tile::tile_sprite_update, ), ) - .add_systems(FixedUpdate, draw_cursor) + .add_systems(FixedUpdate, cursor::move_cursor) .run(); } - -fn draw_cursor( - camera_query: Single<(&Camera, &GlobalTransform)>, - windows: Query<&Window>, - mut gizmos: Gizmos, -) { - let (camera, camera_transform) = *camera_query; - - let Ok(window) = windows.get_single() else { - return; - }; - - let Some(cursor_position) = window.cursor_position() else { - return; - }; - - // Calculate a world position based on the cursor's position. - let Ok(point) = camera.viewport_to_world_2d(camera_transform, cursor_position) else { - return; - }; - println!( - "pos: {}, {}", - (point.x / (16. * PIXEL_RATIO)) as i32, - (point.y / (16. * PIXEL_RATIO)) as i32 - ); - - gizmos.circle_2d(point, 10., WHITE); -} diff --git a/src/tiles.rs b/src/tiles.rs index c2abcd6..dde39cc 100644 --- a/src/tiles.rs +++ b/src/tiles.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; use crate::tile::{Tile, TileState}; -use crate::game::PIXEL_RATIO; +use crate::constants::*; #[derive(Bundle)] pub struct TilePrefab {