158 lines
4.6 KiB
C#
158 lines
4.6 KiB
C#
using ColdMint.scripts.utils;
|
||
using Godot;
|
||
|
||
namespace ColdMint.scripts;
|
||
|
||
public partial class HealthBarUi : HBoxContainer
|
||
{
|
||
private int _maxHp;
|
||
private int _currentHp;
|
||
|
||
public int CurrentHp
|
||
{
|
||
get => _currentHp;
|
||
set
|
||
{
|
||
if (value == _currentHp)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (_currentHp > _maxHp)
|
||
{
|
||
//Prohibit the current health to exceed the maximum health. When the maximum health is exceeded, the UI cannot be drawn.
|
||
//禁止当前血量超过最大血量,当超过最大值时,无法绘制UI。
|
||
return;
|
||
}
|
||
|
||
var heartCount = GetChildCount();
|
||
//A few hearts are full
|
||
//有几颗心是满的
|
||
var fullHeartCount = value / Config.HeartRepresentsHealthValue;
|
||
for (int i = 0; i < fullHeartCount; i++)
|
||
{
|
||
//Brush up the Ui
|
||
//把Ui刷满
|
||
var textureRect = GetChild<TextureRect>(i);
|
||
textureRect.Texture = _heartFull;
|
||
}
|
||
|
||
//How many hollows
|
||
//有多少空心
|
||
var emptyHeartCount = heartCount - fullHeartCount;
|
||
if (emptyHeartCount > 0)
|
||
{
|
||
//How much blood is left on the last one
|
||
//最后那颗剩余多少血
|
||
var leftOverTextureRect = GetChild<TextureRect>(fullHeartCount);
|
||
var leftOver = value % Config.HeartRepresentsHealthValue;
|
||
if (leftOver > 0)
|
||
{
|
||
//Percentage of total
|
||
//占总数的百分比
|
||
var percent = leftOver / (float)Config.HeartRepresentsHealthValue;
|
||
leftOverTextureRect.Texture = GetTexture2DByPercent(percent);
|
||
emptyHeartCount--;
|
||
}
|
||
}
|
||
|
||
|
||
for (int i = heartCount - emptyHeartCount; i < heartCount; i++)
|
||
{
|
||
var textureRect = GetChild<TextureRect>(i);
|
||
textureRect.Texture = _heartEmpty;
|
||
}
|
||
|
||
_currentHp = value;
|
||
}
|
||
}
|
||
|
||
public int MaxHp
|
||
{
|
||
get => _maxHp;
|
||
set
|
||
{
|
||
if (value == _maxHp)
|
||
{
|
||
return;
|
||
}
|
||
|
||
var heartCount = value / Config.HeartRepresentsHealthValue;
|
||
for (var i = 0; i < heartCount; i++)
|
||
{
|
||
var heart = CreateTextureRect();
|
||
heart.Texture = _heartFull;
|
||
AddChild(heart);
|
||
}
|
||
|
||
//How much blood is left on the last one
|
||
//最后那颗剩余多少血
|
||
var leftOver = value % Config.HeartRepresentsHealthValue;
|
||
if (leftOver > 0)
|
||
{
|
||
var lastHeart = CreateTextureRect();
|
||
//Percentage of total
|
||
//占总数的百分比
|
||
var percent = leftOver / (float)Config.HeartRepresentsHealthValue;
|
||
lastHeart.Texture = GetTexture2DByPercent(percent);
|
||
AddChild(lastHeart);
|
||
}
|
||
|
||
_maxHp = value;
|
||
}
|
||
}
|
||
|
||
private TextureRect CreateTextureRect()
|
||
{
|
||
var textureRect = new TextureRect();
|
||
return textureRect;
|
||
}
|
||
|
||
/// <summary>
|
||
/// <para>Get the texture based on percentage</para>
|
||
/// <para>根据百分比获取纹理</para>
|
||
/// </summary>
|
||
/// <param name="percent"></param>
|
||
/// <returns></returns>
|
||
private Texture2D? GetTexture2DByPercent(float percent)
|
||
{
|
||
if (percent == 0)
|
||
{
|
||
return _heartEmpty;
|
||
}
|
||
|
||
if (percent <= 0.25f)
|
||
{
|
||
return _heartQuarter;
|
||
}
|
||
else if (percent <= 0.5f)
|
||
{
|
||
return _heartHalf;
|
||
}
|
||
else if (percent <= 0.75f)
|
||
{
|
||
return _heartThreeFourths;
|
||
}
|
||
else
|
||
{
|
||
return _heartFull;
|
||
}
|
||
}
|
||
|
||
private Texture2D? _heartFull;
|
||
private Texture2D? _heartEmpty;
|
||
private Texture2D? _heartHalf;
|
||
private Texture2D? _heartQuarter;
|
||
private Texture2D? _heartThreeFourths;
|
||
|
||
public override void _Ready()
|
||
{
|
||
base._Ready();
|
||
NodeUtils.DeleteAllChild(this);
|
||
_heartEmpty = GD.Load<Texture2D>("res://sprites/ui/HeartEmpty.png");
|
||
_heartQuarter = GD.Load<Texture2D>("res://sprites/ui/HeartQuarter.png");
|
||
_heartHalf = GD.Load<Texture2D>("res://sprites/ui/HeartHalf.png");
|
||
_heartThreeFourths = GD.Load<Texture2D>("res://sprites/ui/HeartThreeFourths.png");
|
||
_heartFull = GD.Load<Texture2D>("res://sprites/ui/HeartFull.png");
|
||
}
|
||
} |