Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / roomUI / LifeBar.cs
@小李xl 小李xl on 24 Jun 2023 2 KB 将玩家血条改为单颗红心
  1. using System.Collections.Generic;
  2. using Godot;
  3.  
  4. namespace UI.RoomUI;
  5.  
  6. public class LifeBar
  7. {
  8.  
  9. private RoomUI.UiNode_LifeBar _bar;
  10. private UiGrid<TextureRect, RoomUI.UiNode_Life, LifeIconEnum> _grid;
  11. private EventFactory _eventFactory;
  12. private bool _refreshFlag = false;
  13.  
  14. public LifeBar(RoomUI.UiNode_LifeBar lifeBar)
  15. {
  16. _bar = lifeBar;
  17. var uiNodeLife = lifeBar.L_Life;
  18.  
  19. _grid = new UiGrid<TextureRect, RoomUI.UiNode_Life, LifeIconEnum>(uiNodeLife, typeof(LifeCell), 20, 1, 2);
  20.  
  21.  
  22. // _grid.Add(LifeIconEnum.FullHeart);
  23. // _grid.Add(LifeIconEnum.HalfHeart);
  24. // _grid.Add(LifeIconEnum.EmptyHeart);
  25. // _grid.Add(LifeIconEnum.FullShield);
  26. // _grid.Add(LifeIconEnum.EmptyShield);
  27. }
  28.  
  29. public void OnShow()
  30. {
  31. _eventFactory = EventManager.CreateEventFactory();
  32. _eventFactory.AddEventListener(EventEnum.OnPlayerHpChange, o => RefreshLife());
  33. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxHpChange, o => RefreshLife());
  34. _eventFactory.AddEventListener(EventEnum.OnPlayerShieldChange, o => RefreshLife());
  35. _eventFactory.AddEventListener(EventEnum.OnPlayerMaxShieldChange, o => RefreshLife());
  36. }
  37.  
  38. public void OnHide()
  39. {
  40. _eventFactory.RemoveAllEventListener();
  41. }
  42.  
  43. public void Process(float delta)
  44. {
  45. if (_refreshFlag)
  46. {
  47. _refreshFlag = false;
  48. HandlerRefreshLife();
  49. }
  50. }
  51. public void RefreshLife()
  52. {
  53. _refreshFlag = true;
  54. }
  55.  
  56. private void HandlerRefreshLife()
  57. {
  58. var player = Player.Current;
  59. if (player.MaxHp % 2 != 0)
  60. {
  61. GD.PrintErr("玩家血量不是偶数!");
  62. }
  63. var list = new List<LifeIconEnum>();
  64. for (var i = 0; i < player.MaxHp / 2; i++)
  65. {
  66. if (player.Hp >= i * 2 + 2)
  67. {
  68. list.Add(LifeIconEnum.FullHeart);
  69. }
  70. else if (player.Hp >= i * 2 + 1)
  71. {
  72. list.Add(LifeIconEnum.HalfHeart);
  73. }
  74. else
  75. {
  76. list.Add(LifeIconEnum.EmptyHeart);
  77. }
  78. }
  79.  
  80. for (var i = 0; i < player.MaxShield; i++)
  81. {
  82. if (player.Shield >= i + 1)
  83. {
  84. list.Add(LifeIconEnum.FullShield);
  85. }
  86. else
  87. {
  88. list.Add(LifeIconEnum.EmptyShield);
  89. }
  90. }
  91. //var maxHp
  92. _grid.SetDataList(list.ToArray());
  93. }
  94.  
  95. }