diff --git a/src/effects/mod.rs b/src/effects/mod.rs index 469b0c4..62d3244 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -4,6 +4,8 @@ use crate::sun_system::{Sun, Satellite, Level}; use crate::collision::{FatalCollisionEvent, HitBox}; mod red_star; mod gravity_viz; +mod selection_glow; +mod touch_feedback; #[derive(Resource)] struct SunFlameConfig { @@ -37,6 +39,8 @@ pub(super) fn plugin(app: &mut App) { app.add_systems(Update, (update_and_render_swallow_fx).in_set(GameplaySystem)); red_star::plugin(app); gravity_viz::plugin(app); + selection_glow::plugin(app); + touch_feedback::plugin(app); } fn draw_sun_flames( @@ -184,6 +188,4 @@ fn update_and_render_swallow_fx( commands.entity(e).despawn(); } } -} - - +} \ No newline at end of file diff --git a/src/effects/touch_feedback.rs b/src/effects/touch_feedback.rs new file mode 100644 index 0000000..edc9237 --- /dev/null +++ b/src/effects/touch_feedback.rs @@ -0,0 +1,67 @@ +use bevy::prelude::*; +use bevy::input::touch::{TouchInput, TouchPhase}; +use crate::GameplaySystem; + +pub fn plugin(app: &mut App) { + app.add_systems(Update, (spawn_touch_feedback, update_touch_feedback).in_set(GameplaySystem)); +} + +#[derive(Component)] +struct TouchFeedback { + elapsed: f32, + duration: f32, +} + +fn spawn_touch_feedback( + mut commands: Commands, + mut er_touch: EventReader, + camera_query: Query<(&Camera, &GlobalTransform)>, + window_q: Query<&Window>, +) { + let Ok((camera, cam_gt)) = camera_query.single() else { return; }; + let Ok(_window) = window_q.single() else { return; }; + + for touch in er_touch.read() { + // Only create feedback on touch start + if touch.phase == TouchPhase::Started { + // Convert screen position to world position + if let Ok(world_pos) = camera.viewport_to_world_2d(cam_gt, touch.position) { + commands.spawn(( + TouchFeedback { + elapsed: 0.0, + duration: 0.5, + }, + Transform::from_translation(world_pos.extend(0.0)), + )); + } + } + } +} + +fn update_touch_feedback( + mut commands: Commands, + mut gizmos: Gizmos, + mut query: Query<(Entity, &mut TouchFeedback, &Transform)>, + time: Res