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. public LifeBarHandler(RoomUI.LifeBar lifeBar)
  16. {
  17. _bar = lifeBar;
  18. var uiNodeLife = lifeBar.L_Life;
  19.  
  20. _grid = lifeBar.UiPanel.CreateUiGrid<RoomUI.Life, LifeIconEnum, LifeCell>(uiNodeLife);
  21. _grid.SetAutoColumns(true);
  22. _grid.SetHorizontalExpand(true);
  23. _grid.SetCellOffset(new Vector2I(1, 2));
  24. }
  25.  
  26. public void OnShow()
  27. {
  28. _eventFactory = EventManager.CreateEventFactory();
  29. _eventFactory.AddEventListener(EventEnum.OnPlayerHpChange, o => RefreshLife());
  30. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife());
  31. _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife());
  32. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife());
  33. _eventFactory.AddEventListener(EventEnum.OnPlayerGoldChange, o => RefreshGold());
  34. RefreshLife();
  35. RefreshGold();
  36. }
  37.  
  38. public void OnHide()
  39. {
  40. _eventFactory.RemoveAllEventListener();
  41. }
  42.  
  43. public void Process(float delta)
  44. {
  45. if (_refreshHpFlag)
  46. {
  47. _refreshHpFlag = false;
  48. HandlerRefreshLife();
  49. }
  50.  
  51. if (_refreshGoldFlag)
  52. {
  53. _refreshGoldFlag = false;
  54. HandlerRefreshGold();
  55. }
  56. }
  57.  
  58. public void RefreshGold()
  59. {
  60. _refreshGoldFlag = true;
  61. }
  62. public void RefreshLife()
  63. {
  64. _refreshHpFlag = true;
  65. }
  66.  
  67. private void HandlerRefreshLife()
  68. {
  69. var player = World.Current.Player;
  70. if (player.MaxHp % 2 != 0)
  71. {
  72. Debug.LogError("玩家血量不是偶数!");
  73. }
  74. var list = new List<LifeIconEnum>();
  75. for (var i = 0; i < player.MaxHp / 2; i++)
  76. {
  77. if (player.Hp >= i * 2 + 2)
  78. {
  79. list.Add(LifeIconEnum.FullHeart);
  80. }
  81. else if (player.Hp >= i * 2 + 1)
  82. {
  83. list.Add(LifeIconEnum.HalfHeart);
  84. }
  85. else
  86. {
  87. list.Add(LifeIconEnum.EmptyHeart);
  88. }
  89. }
  90.  
  91. for (var i = 0; i < player.MaxShield; i++)
  92. {
  93. if (player.Shield >= i + 1)
  94. {
  95. list.Add(LifeIconEnum.FullShield);
  96. }
  97. else
  98. {
  99. list.Add(LifeIconEnum.EmptyShield);
  100. }
  101. }
  102. //var maxHp
  103. _grid.SetDataList(list.ToArray());
  104. }
  105. private void HandlerRefreshGold()
  106. {
  107. _bar.L_Gold.L_GoldText.Instance.Text = World.Current.Player.RoleState.Gold.ToString();
  108. }
  109.  
  110. }