Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / AffiliationArea.cs
@小李xl 小李xl on 7 Mar 2023 3 KB 房间内敌人死光时开门
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 归属区域
  8. /// </summary>
  9. public partial class AffiliationArea : Area2D
  10. {
  11. /// <summary>
  12. /// 当前实例所属房间
  13. /// </summary>
  14. public RoomInfo RoomInfo;
  15. /// <summary>
  16. /// 当前归属区域包含的所有物体对象
  17. /// </summary>
  18. private readonly HashSet<ActivityObject> _includeItems = new HashSet<ActivityObject>();
  19.  
  20. private bool _init = false;
  21. /// <summary>
  22. /// 根据矩形区域初始化归属区域
  23. /// </summary>
  24. public void Init(RoomInfo roomInfo, Rect2 rect2)
  25. {
  26. if (_init)
  27. {
  28. return;
  29. }
  30.  
  31. _init = true;
  32.  
  33. RoomInfo = roomInfo;
  34. var collisionShape = new CollisionShape2D();
  35. collisionShape.GlobalPosition = rect2.Position + rect2.Size / 2;
  36. var shape = new RectangleShape2D();
  37. shape.Size = rect2.Size;
  38. collisionShape.Shape = shape;
  39. AddChild(collisionShape);
  40. _Init();
  41. }
  42.  
  43. // /// <summary>
  44. // /// 更具多边形初始化归属区域
  45. // /// </summary>
  46. // public void Init(Vector2[] polygon)
  47. // {
  48. // if (_init)
  49. // {
  50. // return;
  51. // }
  52. //
  53. // _init = true;
  54. // var collisionPolygon = new CollisionPolygon2D();
  55. // collisionPolygon.Polygon = polygon;
  56. // AddChild(collisionPolygon);
  57. // _Init();
  58. // }
  59.  
  60. private void _Init()
  61. {
  62. Monitoring = true;
  63. Monitorable = false;
  64. CollisionLayer = PhysicsLayer.None;
  65. CollisionMask = PhysicsLayer.Props | PhysicsLayer.Player | PhysicsLayer.Enemy;
  66.  
  67. BodyEntered += OnBodyEntered;
  68. }
  69.  
  70. /// <summary>
  71. /// 将物体添加到当前所属区域中
  72. /// </summary>
  73. public void InsertItem(ActivityObject activityObject)
  74. {
  75. if (activityObject.Affiliation == this)
  76. {
  77. return;
  78. }
  79.  
  80. if (activityObject.Affiliation != null)
  81. {
  82. activityObject.Affiliation.RemoveItem(activityObject);
  83. }
  84. activityObject.Affiliation = this;
  85. _includeItems.Add(activityObject);
  86. }
  87.  
  88. /// <summary>
  89. /// 将物体从当前所属区域移除
  90. /// </summary>
  91. public void RemoveItem(ActivityObject activityObject)
  92. {
  93. activityObject.Affiliation = null;
  94. _includeItems.Remove(activityObject);
  95. }
  96.  
  97. /// <summary>
  98. /// 获取该区域中物体的总数
  99. /// </summary>
  100. public int GetIncludeItemsCount()
  101. {
  102. return _includeItems.Count;
  103. }
  104.  
  105. /// <summary>
  106. /// 统计符合条件的数量
  107. /// </summary>
  108. /// <param name="handler">操作函数, 返回是否满足要求</param>
  109. public int FindIncludeItemsCount(Func<ActivityObject, bool> handler)
  110. {
  111. var count = 0;
  112. foreach (var activityObject in _includeItems)
  113. {
  114. if (handler(activityObject))
  115. {
  116. count++;
  117. }
  118. }
  119. return count;
  120. }
  121. private void OnBodyEntered(Node2D body)
  122. {
  123. if (body is ActivityObject activityObject)
  124. {
  125. InsertItem(activityObject);
  126. }
  127. }
  128. }