use crate::{
containers::PixelContainer,
core::{CanDraw, Vec2D},
};
pub trait CanCollide {
#[must_use]
fn collides_with_pos(&self, pos: Vec2D) -> bool;
}
#[derive(Clone)]
pub struct CollisionContainer<'e> {
pub elements: Vec<&'e dyn CanCollide>,
}
impl Default for CollisionContainer<'_> {
fn default() -> Self {
Self::new()
}
}
impl<'e> CollisionContainer<'e> {
#[must_use]
pub const fn new() -> Self {
Self { elements: vec![] }
}
pub fn push(&mut self, element: &'e impl CanCollide) {
self.elements.push(element);
}
pub fn overlaps_element(&self, element: &impl CanDraw) -> bool {
self.will_overlap_element(element, Vec2D::ZERO)
}
pub fn will_overlap_element(&self, element: &impl CanDraw, offset: Vec2D) -> bool {
PixelContainer::from(element)
.pixels
.into_iter()
.any(|p| self.collides_with_pos(p.pos + offset))
}
}
impl CanCollide for CollisionContainer<'_> {
fn collides_with_pos(&self, pos: Vec2D) -> bool {
self.elements.iter().any(|e| e.collides_with_pos(pos))
}
}
impl<'e> From<&'e dyn CanCollide> for CollisionContainer<'e> {
fn from(element: &'e dyn CanCollide) -> Self {
Self {
elements: vec![element],
}
}
}