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