From d54148e5db9b81d8d446e189cf3836ba3eb83e72 Mon Sep 17 00:00:00 2001 From: ModZero Date: Sat, 24 Dec 2022 02:55:37 +0100 Subject: [PATCH] Slightly better handling --- src/main.rs | 84 +++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/main.rs b/src/main.rs index 86976c5..24101a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ use bevy::{ diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, - input::mouse::MouseMotion, + input::{mouse::{MouseMotion, MouseButtonInput}, ButtonState}, math::Vec4Swizzles, prelude::*, render::camera::RenderTarget, @@ -176,62 +176,68 @@ fn mouse_motion( buttons: Res>, mut query: Query<(&mut Transform, &mut OrthographicProjection), With>, ) { - if buttons.pressed(MouseButton::Middle) { - for ev in motion_evr.iter() { + + for ev in motion_evr.iter() { + if buttons.pressed(MouseButton::Middle) { for (mut transform, mut _ortho) in query.iter_mut() { let direction = Vec3::new(ev.delta.x, ev.delta.y * -1.0, 0.0); transform.translation += direction; } - } + } } } fn pawn_control( mut commands: Commands, wnds: Res, - buttons: Res>, query: Query>, + mut buttons_evr: EventReader, camera_q: Query<(&GlobalTransform, &Camera)>, tilemap_q: Query<(&TilemapSize, &TilemapGridSize, &TilemapType, &Transform)>, ) { - if buttons.just_released(MouseButton::Right) { - let (cam_gt, cam) = camera_q.single(); - let wnd = if let RenderTarget::Window(id) = cam.target { - wnds.get(id).unwrap() - } else { - wnds.get_primary().unwrap() - }; - - if let Some(screen_pos) = wnd.cursor_position() { - query.for_each(|entity| { - if let Some(world_ray) = cam.viewport_to_world(cam_gt, screen_pos) { - let (map_size, map_grid_size, map_type, map_t) = tilemap_q.single(); - - let tilemap_pos = (map_t.compute_matrix().inverse() - * Vec4::from((world_ray.origin, 1.0))) - .xy(); - info!("WP {:?} {:?}", world_ray.origin, tilemap_pos); - if let Some(tile_pos) = - TilePos::from_world_pos(&tilemap_pos, map_size, map_grid_size, map_type) - { - info!("{:?}", tile_pos); - commands.entity(entity).insert(PawnDest { - x: tile_pos.x, - y: tile_pos.y, - }); + for ev in buttons_evr.iter() { + if (ev.button == MouseButton::Right) && (ev.state == ButtonState::Released) { + let (cam_gt, cam) = camera_q.single(); + let wnd = if let RenderTarget::Window(id) = cam.target { + wnds.get(id).unwrap() + } else { + wnds.get_primary().unwrap() + }; + + if let Some(screen_pos) = wnd.cursor_position() { + query.for_each(|entity| { + if let Some(world_ray) = cam.viewport_to_world(cam_gt, screen_pos) { + let (map_size, map_grid_size, map_type, map_t) = tilemap_q.single(); + + let tilemap_pos = (map_t.compute_matrix().inverse() + * Vec4::from((world_ray.origin, 1.0))) + .xy(); + info!("WP {:?} {:?}", world_ray.origin, tilemap_pos); + if let Some(tile_pos) = + TilePos::from_world_pos(&tilemap_pos, map_size, map_grid_size, map_type) + { + info!("{:?}", tile_pos); + commands.entity(entity).insert(PawnDest { + x: tile_pos.x, + y: tile_pos.y, + }); + } } - } - }); + }); + } } } + } +type ChangedPawns = Or<(Changed, With)>; + fn pawn_motion( mut commands: Commands, - mut pawn_q: Query<(Entity, &mut PawnPos, &mut Transform, Option<&PawnDest>)>, - tilemap_q: Query<(&TilemapGridSize, &TilemapTileSize, &TilemapType)>, + mut pawn_q: Query<(Entity, &mut PawnPos, &mut Transform, Option<&PawnDest>), ChangedPawns>, + tilemap_q: Query<&TilemapTileSize>, ) { - let (map_grid_size, map_tile_size, map_type) = tilemap_q.single(); + let map_tile_size = tilemap_q.single(); pawn_q.for_each_mut(|(entity, mut pos, mut transform, dest)| match dest { Some(d) => { pos.x = d.x; @@ -244,9 +250,11 @@ fn pawn_motion( commands.entity(entity).remove::(); } None => { - let world_pos = TilePos::new(pos.x, pos.y).center_in_world(map_grid_size, map_type); - transform.translation.x = world_pos.x; - transform.translation.y = world_pos.y; + transform.translation = Vec3::from(( + (pos.x as f32) * map_tile_size.x, + (pos.y as f32) * map_tile_size.y, + 1.0, + )); } }) }