Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / roomMap / RoomMapPanel.cs
@小李xl 小李xl on 1 Dec 2023 5 KB 记录敌人位置,开发中
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Godot;
  4.  
  5. namespace UI.RoomMap;
  6.  
  7. public partial class RoomMapPanel : RoomMap
  8. {
  9. private EventFactory _factory = EventManager.CreateEventFactory();
  10. private List<RoomDoorInfo> _needRefresh = new List<RoomDoorInfo>();
  11. private List<Sprite2D> _enemyList = new List<Sprite2D>();
  12. private Stack<Sprite2D> _spriteStack = new Stack<Sprite2D>();
  13. public override void OnCreateUi()
  14. {
  15. InitMap();
  16. _factory.AddEventListener(EventEnum.OnPlayerFirstEnterRoom, OnPlayerFirstEnterRoom);
  17. _factory.AddEventListener(EventEnum.OnPlayerFirstEnterAisle, OnPlayerFirstEnterAisle);
  18. }
  19.  
  20.  
  21. public override void OnDestroyUi()
  22. {
  23. _factory.RemoveAllEventListener();
  24. }
  25.  
  26. public override void Process(float delta)
  27. {
  28. // //按下地图按键
  29. // if (InputManager.Map && !S_RoomMap.Instance.IsOpen)
  30. // {
  31. // World.Current.Pause = true;
  32. // S_RoomMap.Instance.ShowUi();
  33. // }
  34. // else if (!InputManager.Map && S_RoomMap.Instance.IsOpen)
  35. // {
  36. // S_RoomMap.Instance.HideUi();
  37. // World.Current.Pause = false;
  38. // }
  39. //更新敌人位置
  40. if (World.Current != null)
  41. {
  42. foreach (var enemy in World.Current.Enemy_InstanceList)
  43. {
  44. if (!enemy.IsDestroyed && !enemy.IsDie)
  45. {
  46. }
  47. }
  48. }
  49. //更新预览图标
  50. if (_needRefresh.Count > 0)
  51. {
  52. foreach (var roomDoorInfo in _needRefresh)
  53. {
  54. HandlerRefreshUnknownSprite(roomDoorInfo);
  55. }
  56. _needRefresh.Clear();
  57. }
  58.  
  59. //更新地图中心点位置
  60. S_Root.Instance.Position = CalcRootPosition(Player.Current.Position);
  61. }
  62. //初始化小地图
  63. private void InitMap()
  64. {
  65. var startRoom = GameApplication.Instance.DungeonManager.StartRoomInfo;
  66. startRoom.EachRoom(roomInfo =>
  67. {
  68. roomInfo.PreviewSprite.Visible = false;
  69. S_Root.AddChild(roomInfo.PreviewSprite);
  70.  
  71. if (roomInfo.Doors != null)
  72. {
  73. foreach (var roomInfoDoor in roomInfo.Doors)
  74. {
  75. if (roomInfoDoor.IsForward)
  76. {
  77. roomInfoDoor.AislePreviewSprite.Visible = false;
  78. S_Root.AddChild(roomInfoDoor.AislePreviewSprite);
  79. }
  80. }
  81. }
  82. });
  83. }
  84. private void OnPlayerFirstEnterRoom(object data)
  85. {
  86. var roomInfo = (RoomInfo)data;
  87. roomInfo.PreviewSprite.Visible = true;
  88. if (roomInfo.Doors!= null)
  89. {
  90. foreach (var roomDoor in roomInfo.Doors)
  91. {
  92. RefreshUnknownSprite(roomDoor);
  93. }
  94. }
  95. }
  96. private void OnPlayerFirstEnterAisle(object data)
  97. {
  98. var roomDoorInfo = (RoomDoorInfo)data;
  99. roomDoorInfo.AislePreviewSprite.Visible = true;
  100.  
  101. RefreshUnknownSprite(roomDoorInfo);
  102. RefreshUnknownSprite(roomDoorInfo.ConnectDoor);
  103. }
  104.  
  105. private void RefreshUnknownSprite(RoomDoorInfo roomDoorInfo)
  106. {
  107. if (!_needRefresh.Contains(roomDoorInfo))
  108. {
  109. _needRefresh.Add(roomDoorInfo);
  110. }
  111. }
  112.  
  113. private void HandlerRefreshUnknownSprite(RoomDoorInfo roomDoorInfo)
  114. {
  115. //是否探索房间
  116. var flag1 = roomDoorInfo.RoomInfo.RoomFogMask.IsExplored;
  117. //是否探索过道
  118. var flag2 = roomDoorInfo.AisleFogMask.IsExplored;
  119. if (flag1 == flag2) //不显示问号
  120. {
  121. if (roomDoorInfo.UnknownSprite != null)
  122. {
  123. roomDoorInfo.UnknownSprite.QueueFree();
  124. roomDoorInfo.UnknownSprite = null;
  125. }
  126. }
  127. else
  128. {
  129. var unknownSprite = roomDoorInfo.UnknownSprite ?? CreateUnknownSprite(roomDoorInfo);
  130. var pos = (roomDoorInfo.OriginPosition + roomDoorInfo.GetEndPosition()) / 2;
  131. if (!flag2) //偏向过道
  132. {
  133. if (roomDoorInfo.Direction == DoorDirection.N)
  134. pos += new Vector2I(0, -2);
  135. else if (roomDoorInfo.Direction == DoorDirection.S)
  136. pos += new Vector2I(0, 2);
  137. else if (roomDoorInfo.Direction == DoorDirection.E)
  138. pos += new Vector2I(2, 0);
  139. else if (roomDoorInfo.Direction == DoorDirection.W)
  140. pos += new Vector2I(-2, 0);
  141. }
  142. else //偏向房间
  143. {
  144. if (roomDoorInfo.Direction == DoorDirection.N)
  145. pos -= new Vector2I(0, -2);
  146. else if (roomDoorInfo.Direction == DoorDirection.S)
  147. pos -= new Vector2I(0, 2);
  148. else if (roomDoorInfo.Direction == DoorDirection.E)
  149. pos -= new Vector2I(2, 0);
  150. else if (roomDoorInfo.Direction == DoorDirection.W)
  151. pos -= new Vector2I(-2, 0);
  152. }
  153. unknownSprite.Position = pos;
  154. }
  155. }
  156.  
  157. private Sprite2D CreateUnknownSprite(RoomDoorInfo roomInfoDoor)
  158. {
  159. var unknownSprite = new Sprite2D();
  160. unknownSprite.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Unknown_png);
  161. unknownSprite.Scale = new Vector2(0.25f, 0.25f);
  162. roomInfoDoor.UnknownSprite = unknownSprite;
  163. S_Root.AddChild(unknownSprite);
  164. return unknownSprite;
  165. }
  166.  
  167. private Vector2 CalcRootPosition(Vector2 pos)
  168. {
  169. return S_DrawContainer.Instance.Size / 2 - pos / 16 * S_Root.Instance.Scale;
  170. }
  171.  
  172. }