use crate::*;
impl Entity {
pub fn generate_id() -> u64 {
NEXT_ENTITY_ID.fetch_add(1, Ordering::Relaxed)
}
pub fn create(name: &str) -> Entity {
Entity::new(
Self::generate_id(),
name.to_string(),
Transform2D::identity(),
true,
Vec::new(),
Vec::new(),
)
}
pub fn create_at(position: Vector2D) -> Entity {
let mut entity: Entity = Self::create(DEFAULT_ENTITY_NAME);
entity.get_mut_transform().set_position(position);
entity
}
}
impl Entity {
pub fn add_component(&mut self, component: ComponentRc) {
component.borrow_mut().on_start();
self.get_mut_components().push(component);
}
pub fn remove_component_by_name(&mut self, name: &str) -> Option<ComponentRc> {
let position: Option<usize> = self
.get_components()
.iter()
.position(|component: &ComponentRc| component.borrow().name() == name);
let index: usize = position?;
let removed: ComponentRc = self.get_mut_components().remove(index);
removed.borrow_mut().on_destroy();
Some(removed)
}
pub fn get_component_by_name(&self, name: &str) -> Option<ComponentRc> {
self.get_components()
.iter()
.find(|component: &&ComponentRc| component.borrow().name() == name)
.cloned()
}
pub fn update(&mut self, delta_time: f64) {
if !self.get_active() {
return;
}
for component in self.get_components() {
component.borrow_mut().on_update(delta_time);
}
}
pub fn render(&self, context: &CanvasRenderingContext2d) {
if !self.get_active() {
return;
}
let transform: Transform2D = self.get_transform();
for component in self.get_components() {
component.borrow_mut().on_render(context, &transform);
}
}
pub fn destroy(&mut self) {
for component in self.get_components() {
component.borrow_mut().on_destroy();
}
self.get_mut_components().clear();
}
pub fn add_tag(&mut self, tag: String) {
if !self.get_tags().contains(&tag) {
self.get_mut_tags().push(tag);
}
}
pub fn has_tag(&self, tag: &str) -> bool {
self.get_tags().iter().any(|t: &String| t == tag)
}
}