ComponentMapper.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using MonoGame.Extended.Collections;
  3. namespace MonoGame.Extended.ECS
  4. {
  5. public abstract class ComponentMapper
  6. {
  7. protected ComponentMapper(int id, Type componentType)
  8. {
  9. Id = id;
  10. ComponentType = componentType;
  11. }
  12. public int Id { get; }
  13. public Type ComponentType { get; }
  14. public abstract bool Has(int entityId);
  15. public abstract void Delete(int entityId);
  16. }
  17. public class ComponentMapper<T> : ComponentMapper
  18. where T : class
  19. {
  20. public event Action<int> OnPut;
  21. public event Action<int> OnDelete;
  22. private readonly Action<int> _onCompositionChanged;
  23. public ComponentMapper(int id, Action<int> onCompositionChanged)
  24. : base(id, typeof(T))
  25. {
  26. _onCompositionChanged = onCompositionChanged;
  27. Components = new Bag<T>();
  28. }
  29. public Bag<T> Components { get; }
  30. public void Put(int entityId, T component)
  31. {
  32. Components[entityId] = component;
  33. _onCompositionChanged(entityId);
  34. OnPut?.Invoke(entityId);
  35. }
  36. public T Get(Entity entity)
  37. {
  38. return Get(entity.Id);
  39. }
  40. public T Get(int entityId)
  41. {
  42. return Components[entityId];
  43. }
  44. public override bool Has(int entityId)
  45. {
  46. if (entityId >= Components.Count)
  47. return false;
  48. return Components[entityId] != null;
  49. }
  50. public override void Delete(int entityId)
  51. {
  52. Components[entityId] = null;
  53. _onCompositionChanged(entityId);
  54. OnDelete?.Invoke(entityId);
  55. }
  56. }
  57. }