Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / AffiliationArea.cs
@lijincheng lijincheng 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. //玩家是否是第一次进入
  22. private bool _isFirstEnterFlag = true;
  23. /// <summary>
  24. /// 根据矩形区域初始化归属区域
  25. /// </summary>
  26. public void Init(RoomInfo roomInfo, Rect2 rect2)
  27. {
  28. if (_init)
  29. {
  30. return;
  31. }
  32.  
  33. _init = true;
  34.  
  35. RoomInfo = roomInfo;
  36. var collisionShape = new CollisionShape2D();
  37. collisionShape.GlobalPosition = rect2.Position + rect2.Size / 2;
  38. var shape = new RectangleShape2D();
  39. shape.Size = rect2.Size;
  40. collisionShape.Shape = shape;
  41. AddChild(collisionShape);
  42. _Init();
  43. }
  44.  
  45. private void _Init()
  46. {
  47. Monitoring = true;
  48. Monitorable = false;
  49. CollisionLayer = PhysicsLayer.None;
  50. CollisionMask = PhysicsLayer.Props | PhysicsLayer.Player | PhysicsLayer.Enemy;
  51.  
  52. BodyEntered += OnBodyEntered;
  53. }
  54.  
  55. /// <summary>
  56. /// 将物体添加到当前所属区域中
  57. /// </summary>
  58. public void InsertItem(ActivityObject activityObject)
  59. {
  60. if (activityObject.Affiliation == this)
  61. {
  62. return;
  63. }
  64.  
  65. if (activityObject.Affiliation != null)
  66. {
  67. activityObject.Affiliation.RemoveItem(activityObject);
  68. }
  69. activityObject.Affiliation = this;
  70. _includeItems.Add(activityObject);
  71.  
  72. //如果是玩家
  73. if (activityObject == Player.Current)
  74. {
  75. OnPlayerEnterRoom();
  76. }
  77. }
  78.  
  79. /// <summary>
  80. /// 将物体从当前所属区域移除
  81. /// </summary>
  82. public void RemoveItem(ActivityObject activityObject)
  83. {
  84. activityObject.Affiliation = null;
  85. _includeItems.Remove(activityObject);
  86. }
  87.  
  88. /// <summary>
  89. /// 获取该区域中物体的总数
  90. /// </summary>
  91. public int GetIncludeItemsCount()
  92. {
  93. return _includeItems.Count;
  94. }
  95.  
  96. /// <summary>
  97. /// 统计符合条件的数量
  98. /// </summary>
  99. /// <param name="handler">操作函数, 返回是否满足要求</param>
  100. public int FindIncludeItemsCount(Func<ActivityObject, bool> handler)
  101. {
  102. var count = 0;
  103. foreach (var activityObject in _includeItems)
  104. {
  105. if (handler(activityObject))
  106. {
  107. count++;
  108. }
  109. }
  110. return count;
  111. }
  112. private void OnBodyEntered(Node2D body)
  113. {
  114. if (body is ActivityObject activityObject)
  115. {
  116. InsertItem(activityObject);
  117. }
  118. }
  119.  
  120. //玩家进入房间
  121. private void OnPlayerEnterRoom()
  122. {
  123. if (_isFirstEnterFlag)
  124. {
  125. EventManager.EmitEvent(EventEnum.OnPlayerFirstEnterRoom, RoomInfo);
  126. _isFirstEnterFlag = false;
  127. }
  128. EventManager.EmitEvent(EventEnum.OnPlayerEnterRoom, RoomInfo);
  129. }
  130. }