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.  
  10. private EventFactory _factory = EventManager.CreateEventFactory();
  11. private List<RoomDoorInfo> _needRefresh = new List<RoomDoorInfo>();
  12. public override void OnCreateUi()
  13. {
  14. InitMap();
  15. _factory.AddEventListener(EventEnum.OnPlayerFirstEnterRoom, OnPlayerFirstEnterRoom);
  16. _factory.AddEventListener(EventEnum.OnPlayerFirstEnterAisle, OnPlayerFirstEnterAisle);
  17. }
  18.  
  19.  
  20. public override void OnDestroyUi()
  21. {
  22. _factory.RemoveAllEventListener();
  23. }
  24.  
  25. public override void Process(float delta)
  26. {
  27. // //按下地图按键
  28. // if (InputManager.Map && !S_RoomMap.Instance.IsOpen)
  29. // {
  30. // World.Current.Pause = true;
  31. // S_RoomMap.Instance.ShowUi();
  32. // }
  33. // else if (!InputManager.Map && S_RoomMap.Instance.IsOpen)
  34. // {
  35. // S_RoomMap.Instance.HideUi();
  36. // World.Current.Pause = false;
  37. // }
  38.  
  39. if (_needRefresh.Count > 0)
  40. {
  41. foreach (var roomDoorInfo in _needRefresh)
  42. {
  43. HandlerRefreshUnknownSprite(roomDoorInfo);
  44. }
  45. _needRefresh.Clear();
  46. }
  47.  
  48. S_Root.Instance.Position = S_DrawContainer.Instance.Size / 2 - Player.Current.Position / 16 * S_Root.Instance.Scale;
  49. }
  50. //初始化小地图
  51. private void InitMap()
  52. {
  53. var startRoom = GameApplication.Instance.DungeonManager.StartRoomInfo;
  54. startRoom.EachRoom(roomInfo =>
  55. {
  56. roomInfo.PreviewSprite.Visible = false;
  57. S_Root.AddChild(roomInfo.PreviewSprite);
  58.  
  59. if (roomInfo.Doors != null)
  60. {
  61. foreach (var roomInfoDoor in roomInfo.Doors)
  62. {
  63. if (roomInfoDoor.IsForward)
  64. {
  65. roomInfoDoor.AislePreviewSprite.Visible = false;
  66. S_Root.AddChild(roomInfoDoor.AislePreviewSprite);
  67. }
  68. }
  69. }
  70. });
  71. }
  72. private void OnPlayerFirstEnterRoom(object data)
  73. {
  74. var roomInfo = (RoomInfo)data;
  75. roomInfo.PreviewSprite.Visible = true;
  76. if (roomInfo.Doors!= null)
  77. {
  78. foreach (var roomDoor in roomInfo.Doors)
  79. {
  80. RefreshUnknownSprite(roomDoor);
  81. }
  82. }
  83. }
  84. private void OnPlayerFirstEnterAisle(object data)
  85. {
  86. var roomDoorInfo = (RoomDoorInfo)data;
  87. roomDoorInfo.AislePreviewSprite.Visible = true;
  88.  
  89. RefreshUnknownSprite(roomDoorInfo);
  90. RefreshUnknownSprite(roomDoorInfo.ConnectDoor);
  91. }
  92.  
  93. private void RefreshUnknownSprite(RoomDoorInfo roomDoorInfo)
  94. {
  95. if (!_needRefresh.Contains(roomDoorInfo))
  96. {
  97. _needRefresh.Add(roomDoorInfo);
  98. }
  99. }
  100.  
  101. private void HandlerRefreshUnknownSprite(RoomDoorInfo roomDoorInfo)
  102. {
  103. //是否探索房间
  104. var flag1 = roomDoorInfo.RoomInfo.RoomFogMask.IsExplored;
  105. //是否探索过道
  106. var flag2 = roomDoorInfo.AisleFogMask.IsExplored;
  107. if (flag1 == flag2) //不显示问号
  108. {
  109. if (roomDoorInfo.UnknownSprite != null)
  110. {
  111. roomDoorInfo.UnknownSprite.QueueFree();
  112. roomDoorInfo.UnknownSprite = null;
  113. }
  114. }
  115. else
  116. {
  117. var unknownSprite = roomDoorInfo.UnknownSprite ?? CreateUnknownSprite(roomDoorInfo);
  118. var pos = (roomDoorInfo.OriginPosition + roomDoorInfo.GetEndPosition()) / 2;
  119. if (!flag2) //偏向过道
  120. {
  121. if (roomDoorInfo.Direction == DoorDirection.N)
  122. pos += new Vector2I(0, -2);
  123. else if (roomDoorInfo.Direction == DoorDirection.S)
  124. pos += new Vector2I(0, 2);
  125. else if (roomDoorInfo.Direction == DoorDirection.E)
  126. pos += new Vector2I(2, 0);
  127. else if (roomDoorInfo.Direction == DoorDirection.W)
  128. pos += new Vector2I(-2, 0);
  129. }
  130. else //偏向房间
  131. {
  132. if (roomDoorInfo.Direction == DoorDirection.N)
  133. pos -= new Vector2I(0, -2);
  134. else if (roomDoorInfo.Direction == DoorDirection.S)
  135. pos -= new Vector2I(0, 2);
  136. else if (roomDoorInfo.Direction == DoorDirection.E)
  137. pos -= new Vector2I(2, 0);
  138. else if (roomDoorInfo.Direction == DoorDirection.W)
  139. pos -= new Vector2I(-2, 0);
  140. }
  141. unknownSprite.Position = pos;
  142. }
  143. }
  144.  
  145. private Sprite2D CreateUnknownSprite(RoomDoorInfo roomInfoDoor)
  146. {
  147. var unknownSprite = new Sprite2D();
  148. unknownSprite.Texture = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Unknown_png);
  149. unknownSprite.Scale = new Vector2(0.25f, 0.25f);
  150. roomInfoDoor.UnknownSprite = unknownSprite;
  151. S_Root.AddChild(unknownSprite);
  152. return unknownSprite;
  153. }
  154.  
  155. }