use bevy::prelude::*;
mod collision;
use collision::*;
pub struct ColliderBuilder;
impl ColliderBuilder {
pub fn new_rectangle_collider(half_x: f32, half_y: f32, position: Vec2) -> RectangleCollider {
RectangleCollider { half_x, half_y, position }
}
}
#[cfg(feature = "plugin")]
pub struct ColliderPlugin;
#[cfg(feature = "plugin")]
impl Plugin for ColliderPlugin {
fn build(&self, app: &mut App) {
#[cfg(feature = "event")]
app.add_systems(Update, event_trigger).add_event::<CollisionEvent>();
if cfg!(feature = "auto_move") {
app.add_plugins(CollisionPlugin);
}
}
}
#[cfg(feature = "event")]
#[derive(Event)]
pub struct CollisionEvent {
collider1: RectangleCollider,
collider2: RectangleCollider
}
#[cfg(feature = "event")]
pub fn event_trigger(collider_query: Query<(Entity, &RectangleCollider), With<RectangleCollider>>, mut commands: Commands) {
let collider_query2 = collider_query.clone();
for (entity,collider) in collider_query.iter() {
for (_, collider2) in collider_query2.iter() {
if collider.position != collider2.position {
if collider.clone().check_collision(&collider2.clone()) {
commands.trigger_targets(CollisionEvent{collider1:collider.clone(), collider2:collider2.clone()}, entity);
}
}
}
}
}
#[cfg(feature = "plugin")]
#[cfg(not(any(feature = "auto_move", feature = "event")))]
compile_error!("Either auto_move or event or both must be enabled to use the plugin");