using System; using System.Collections.Specialized; namespace MonoGame.Extended.Entities { public class Entity : IEquatable { private readonly EntityManager _entityManager; private readonly ComponentManager _componentManager; internal Entity(int id, EntityManager entityManager, ComponentManager componentManager) { Id = id; _entityManager = entityManager; _componentManager = componentManager; } public int Id { get; } public BitVector32 ComponentBits => _entityManager.GetComponentBits(Id); public void Attach(T component) where T : class { var mapper = _componentManager.GetMapper(); mapper.Put(Id, component); } public void Detach() where T : class { var mapper = _componentManager.GetMapper(); mapper.Delete(Id); } public T Get() where T : class { var mapper = _componentManager.GetMapper(); return mapper.Get(Id); } public bool Has() where T : class { return _componentManager.GetMapper().Has(Id); } public void Destroy() { _entityManager.Destroy(Id); } public bool Equals(Entity other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Id == other.Id; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != GetType()) return false; return Equals((Entity) obj); } public override int GetHashCode() { // ReSharper disable once NonReadonlyMemberInGetHashCode return Id; } public static bool operator ==(Entity left, Entity right) { return Equals(left, right); } public static bool operator !=(Entity left, Entity right) { return !Equals(left, right); } } }