From 03b59593b7a8575b3f76c7c71ccaef4e8466eb29 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 5 May 2026 00:26:51 +0500 Subject: [PATCH] Simple collisions --- src/collision/collider.rs | 21 +++++++++++++++++++++ src/collision/event.rs | 8 ++++++++ src/collision/mod.rs | 30 +++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/collision/collider.rs create mode 100644 src/collision/event.rs diff --git a/src/collision/collider.rs b/src/collision/collider.rs new file mode 100644 index 0000000..0ff25d4 --- /dev/null +++ b/src/collision/collider.rs @@ -0,0 +1,21 @@ +use bevy::{math::FloatPow, prelude::*}; + +/// Two-dimensional collider that detects collisions with another colliders +/// +/// Composite colliders are not yet supported +#[derive(Component)] +#[require(Transform)] +pub enum Collider { + Circle(f32), +} + +impl Collider { + /// Function that checks collision between two colliders + /// + /// Algorithm is specific for each collider type + pub fn detect_collision(&self, self_center: Vec2, other: &Self, other_center: Vec2) -> bool { + match (self, other) { + (Collider::Circle(self_radius), Collider::Circle(other_radius)) => {(other_center-self_center).length_squared() <= (self_radius+other_radius).squared()} + } + } +} diff --git a/src/collision/event.rs b/src/collision/event.rs new file mode 100644 index 0000000..e6aee9f --- /dev/null +++ b/src/collision/event.rs @@ -0,0 +1,8 @@ +use bevy::prelude::*; + +/// Event that triggers every frame collision occurs +#[derive(EntityEvent)] +pub struct Collided { + pub entity: Entity, + pub with: Entity, +} diff --git a/src/collision/mod.rs b/src/collision/mod.rs index dd37149..d4be93f 100644 --- a/src/collision/mod.rs +++ b/src/collision/mod.rs @@ -1,9 +1,37 @@ use bevy::prelude::*; +use collider::Collider; +use event::Collided; + +mod collider; +mod event; + pub struct CollisionPlugin; impl Plugin for CollisionPlugin { fn build(&self, app: &mut App) { - //todo!() + app.add_systems(Update, detect_collision_system); + } +} + +fn detect_collision_system(mut commands: Commands, query: Query<(Entity, &Transform, &Collider)>) { + for (first_entity, first_transform, first_collider) in query { + for (second_entity, second_transform, second_collider) in query { + if first_entity == second_entity { + continue; + } + + if first_collider.detect_collision( + first_transform.translation.truncate(), + &second_collider, + second_transform.translation.truncate() + ){ + commands.trigger( + Collided { + entity:first_entity, + with:second_entity + }); + } + } } }