From 28269b4bcda283babfffdbeb88207b588e656254 Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Wed, 5 Jul 2023 14:44:29 +0100
Subject: [PATCH] Add basic collision checking system

---
 src/entities/collision.rs | 44 ++++++++++++++++++++++++++++++++++++++-
 src/entities/mod.rs       |  1 +
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/src/entities/collision.rs b/src/entities/collision.rs
index 08a43e7..8064cb9 100644
--- a/src/entities/collision.rs
+++ b/src/entities/collision.rs
@@ -1,5 +1,6 @@
 use crate::deref_as;
-use bevy::prelude::{Color, Component, Rect, Vec2};
+use bevy::math::Vec3Swizzles;
+use bevy::prelude::{Changed, Color, Component, Entity, Query, Rect, Transform, Vec2};
 
 #[derive(Clone, Copy, Debug, Component)]
 pub struct BoxSize(Vec2);
@@ -37,4 +38,45 @@ impl CollisionGroup {
 			Enemy => Color::rgb_u8(133, 20, 75),
 		}
 	}
+
+	pub fn interacts_with(&self, other: CollisionGroup) -> bool {
+		use CollisionGroup::*;
+
+		matches!(
+			(*self, other),
+			(FriendlyProjectile, Enemy)
+				| (Enemy, FriendlyProjectile)
+				| (Player, Pickup)
+				| (Pickup, Player)
+				| (HostileProjectile, Player)
+				| (Player, HostileProjectile)
+		)
+	}
+}
+
+pub fn check_entity_collisions(
+	moved_colliders: Query<(Entity, &Transform, &BoxSize, &CollisionGroup), Changed<Transform>>,
+	all_colliders: Query<(Entity, &Transform, &BoxSize, &CollisionGroup)>,
+) {
+	for (moved_entity, moved_transform, moved_size, moved_group) in &moved_colliders {
+		for (target_entity, target_transform, target_size, target_group) in &all_colliders {
+			if moved_entity == target_entity {
+				continue;
+			}
+
+			let moved_box = Rect::from_center_size(moved_transform.translation.xy(), **moved_size);
+			let target_box =
+				Rect::from_center_size(target_transform.translation.xy(), **target_size);
+
+			if moved_group.interacts_with(*target_group)
+				&& check_box_collisions(moved_box, target_box)
+			{
+				log::info!(
+					"Two colliding entities! {:?} and {:?}",
+					target_entity,
+					moved_entity
+				);
+			}
+		}
+	}
 }
diff --git a/src/entities/mod.rs b/src/entities/mod.rs
index 0b8174e..810dfe2 100644
--- a/src/entities/mod.rs
+++ b/src/entities/mod.rs
@@ -19,6 +19,7 @@ mod _plugin {
 				super::player::process_player_input,
 				super::motion::apply_velocity,
 				super::spawning::apply_despawn_boundaries,
+				super::collision::check_entity_collisions,
 			));
 		}
 	}
-- 
GitLab