Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/effects/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -184,6 +188,4 @@ fn update_and_render_swallow_fx(
commands.entity(e).despawn();
}
}
}


}
67 changes: 67 additions & 0 deletions src/effects/touch_feedback.rs
Original file line number Diff line number Diff line change
@@ -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<TouchInput>,
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<Time>,
) {
for (entity, mut feedback, transform) in query.iter_mut() {
feedback.elapsed += time.delta_secs();
let t = (feedback.elapsed / feedback.duration).clamp(0.0, 1.0);

// Expanding circle effect
let radius = 2.0 + t * 8.0; // Expands from 2.0 to 10.0
let alpha = (1.0 - t).powf(2.0); // Fades out

// Cyan/blue color for touch feedback
let color = Color::srgb(0.3, 0.9, 1.0).with_alpha(0.7 * alpha);

let position = transform.translation.truncate();
let iso = Isometry2d::from_translation(position);
gizmos.circle_2d(iso, radius, color);

// Despawn when animation is complete
if feedback.elapsed >= feedback.duration {
commands.entity(entity).despawn();
}
}
}