Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / roomUI / LifeBarHandler.cs
  1. using System.Collections.Generic;
  2. using Godot;
  3.  
  4. namespace UI.RoomUI;
  5.  
  6. public class LifeBarHandler
  7. {
  8.  
  9. private RoomUI.LifeBar _bar;
  10. private UiGrid<RoomUI.Life, LifeIconEnum> _grid;
  11. private EventFactory _eventFactory;
  12. private bool _refreshHpFlag = false;
  13. private bool _refreshGoldFlag = false;
  14.  
  15. private Role _player;
  16. public LifeBarHandler(RoomUI.LifeBar lifeBar)
  17. {
  18. _bar = lifeBar;
  19. var uiNodeLife = lifeBar.L_Life;
  20.  
  21. _grid = lifeBar.UiPanel.CreateUiGrid<RoomUI.Life, LifeIconEnum, LifeCell>(uiNodeLife);
  22. _grid.SetAutoColumns(true);
  23. _grid.SetHorizontalExpand(true);
  24. _grid.SetCellOffset(new Vector2I(1, 2));
  25. }
  26.  
  27. public void OnShow()
  28. {
  29. _eventFactory = EventManager.CreateEventFactory();
  30. _eventFactory.AddEventListener(EventEnum.OnPlayerHpChange, o => RefreshLife());
  31. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife());
  32. _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife());
  33. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife());
  34. _eventFactory.AddEventListener(EventEnum.OnPlayerGoldChange, o => RefreshGold());
  35. RefreshLife();
  36. RefreshGold();
  37. }
  38.  
  39. public void OnHide()
  40. {
  41. _eventFactory.RemoveAllEventListener();
  42. }
  43.  
  44. public void Process(float delta)
  45. {
  46. if (!_refreshGoldFlag && World.Current != null && _player != World.Current.Player)
  47. {
  48. _player = World.Current.Player;
  49. _refreshHpFlag = true;
  50. }
  51. if (_refreshHpFlag)
  52. {
  53. _refreshHpFlag = false;
  54. HandlerRefreshLife();
  55. }
  56.  
  57. if (_refreshGoldFlag)
  58. {
  59. _refreshGoldFlag = false;
  60. HandlerRefreshGold();
  61. }
  62. }
  63.  
  64. public void RefreshGold()
  65. {
  66. _refreshGoldFlag = true;
  67. }
  68. public void RefreshLife()
  69. {
  70. _refreshHpFlag = true;
  71. }
  72.  
  73. private void HandlerRefreshLife()
  74. {
  75. var player = World.Current.Player;
  76. if (player == null)
  77. {
  78. return;
  79. }
  80. if (player.MaxHp % 2 != 0)
  81. {
  82. Debug.LogError("玩家血量不是偶数!");
  83. }
  84. var list = new List<LifeIconEnum>();
  85. for (var i = 0; i < player.MaxHp / 2; i++)
  86. {
  87. if (player.Hp >= i * 2 + 2)
  88. {
  89. list.Add(LifeIconEnum.FullHeart);
  90. }
  91. else if (player.Hp >= i * 2 + 1)
  92. {
  93. list.Add(LifeIconEnum.HalfHeart);
  94. }
  95. else
  96. {
  97. list.Add(LifeIconEnum.EmptyHeart);
  98. }
  99. }
  100.  
  101. for (var i = 0; i < player.MaxShield; i++)
  102. {
  103. if (player.Shield >= i + 1)
  104. {
  105. list.Add(LifeIconEnum.FullShield);
  106. }
  107. else
  108. {
  109. list.Add(LifeIconEnum.EmptyShield);
  110. }
  111. }
  112. //var maxHp
  113. _grid.SetDataList(list.ToArray());
  114. }
  115. private void HandlerRefreshGold()
  116. {
  117. var player = World.Current.Player;
  118. if (player == null)
  119. {
  120. return;
  121. }
  122.  
  123. _bar.L_Gold.L_GoldText.Instance.Text = player.RoleState.Gold.ToString();
  124. }
  125.  
  126. }