haxis/Source/UnrealProject/GUI/HUD/StatBar.cpp

193 lines
5.7 KiB
C++

// Project Lab - NHTV Igad
#include "UnrealProject.h"
#include "StatBar.h"
static UTexture2D* barTextures[6];
static FLinearColor barColors[4];
static UMaterial* textureBarMaterialClass;
UStatBar::UStatBar(const FObjectInitializer& init) : Super(init)
{
textureBarMaterialClass = ConstructorHelpers::FObjectFinder<UMaterial>(L"/Game/Assets/Art/UI/M_HealthBar2.M_HealthBar2").Object;
barColors[0] = FLinearColor::Green * 0.5f;
barColors[1] = FLinearColor::Red * 0.6f;
barColors[2] = FLinearColor::Blue * 0.8f;
barColors[3] = FLinearColor(1.0f, 0.0f, 1.0f, 1.0f);
barTextures[0] = ConstructorHelpers::FObjectFinder<UTexture2D>(L"/Game/Assets/Art/UI/HealthBar/UI_MainStatusBarHealth").Object;
barTextures[1] = ConstructorHelpers::FObjectFinder<UTexture2D>(L"/Game/Assets/Art/UI/HealthBar/UI_MainStatusBarMana").Object;
m_lastValue = 1.0f;
m_currentValue = 1.0f;
damageAnimationDuration = 0.3f;
m_damageAnimation = 0.0f;
showText = false;
}
void UStatBar::NativeConstruct()
{
Super::NativeConstruct();
m_base = Cast<UImage>(WidgetTree->FindWidget("Base"));
m_blocked = Cast<UImage>(WidgetTree->FindWidget("Blocked"));
m_damage = Cast<UImage>(WidgetTree->FindWidget("Damage"));
m_text = Cast<UTextBlock>(WidgetTree->FindWidget("BarText"));
if(m_damage)
{
m_damage->SetVisibility(ESlateVisibility::Hidden);
UMaterialInstanceDynamic* damageMat = m_damage->GetDynamicMaterial();
damageMat->SetScalarParameterValue("Brightness", 4.0f);
}
if(m_blocked)
m_blocked->SetVisibility(ESlateVisibility::Hidden);
}
#pragma optimize("", off)
void UStatBar::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
{
Super::NativeTick(MyGeometry, InDeltaTime);
if(m_damageAnimation > 0.0f && m_damage)
{
float r = m_damageAnimation / damageAnimationDuration;
float damageSize = (m_currentValue - m_lastValue);
UMaterialInstanceDynamic* matDamage = m_damage->GetDynamicMaterial();
if(damageSize < 0.0f)
{
damageSize *= (1.0f - r);
matDamage->SetScalarParameterValue("Start", m_currentValue);
matDamage->SetScalarParameterValue("End", m_lastValue + damageSize);
}
else
{
damageSize *= (1.0f-r);
matDamage->SetScalarParameterValue("Start", m_lastValue + damageSize);
matDamage->SetScalarParameterValue("End", m_currentValue);
}
m_damageAnimation -= InDeltaTime;
if(m_damageAnimation <= 0.0f)
{
m_damageAnimation = 0.0f;
m_damage->SetVisibility(ESlateVisibility::Hidden);
}
}
}
#pragma optimize("", off)
void UStatBar::SetStat(float newStat, bool applyAnimation)
{
if(!m_base)
return;
if(newStat == m_currentValue)
return;
float delta = newStat - m_currentValue;
if(delta != 0 && m_damageAnimation > 0.0f)
{
// Append animation
float r = m_damageAnimation / damageAnimationDuration;
float damageSize = (m_currentValue - m_lastValue);
if(damageSize < 0.0f)
damageSize *= (1.0f - r);
else
damageSize *= (1.0f - r);
delta += damageSize;
m_lastValue = m_lastValue + damageSize;
}
else
{
m_lastValue = m_currentValue;
}
m_currentValue = newStat;
// Apply animation
if(delta != 0.0f && applyAnimation && m_damage)
{
const FLinearColor deltaColor = FLinearColor(1.0f, 0.0f, 0.0f, 1.0f);
m_damageAnimation = damageAnimationDuration;
UMaterialInstanceDynamic* matDamage = m_base->GetDynamicMaterial();
if(delta < 0.0f)
{
matDamage->SetScalarParameterValue("Start", newStat);
matDamage->SetScalarParameterValue("End", m_lastValue);
}
else
{
matDamage->SetScalarParameterValue("Start", m_lastValue);
matDamage->SetScalarParameterValue("End", newStat);
}
m_damage->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
}
UMaterialInstanceDynamic* matBase = m_base->GetDynamicMaterial();
matBase->SetScalarParameterValue("Start", 0.0f);
matBase->SetScalarParameterValue("End", newStat);
}
void UStatBar::SetStat(int32 newStat, int32 max, bool applyAnimation)
{
if(showText && m_text)
{
FText t = FText::FromString(FString::Printf(L"%d / %d", newStat, max));
m_text->SetText(t);
m_text->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
}
else
{
m_text->SetVisibility(ESlateVisibility::Hidden);
}
float r = (float)newStat / (float)max;
SetStat(r, applyAnimation);
}
void UStatBar::SetBlocked(float newBlocked)
{
if(!m_blocked)
return;
UMaterialInstanceDynamic* mat = m_blocked->GetDynamicMaterial();
if(newBlocked > 0.0f)
{
mat->SetScalarParameterValue("Start", 1.0f - newBlocked);
mat->SetScalarParameterValue("End", 1.0f);
m_blocked->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
}
else
{
m_blocked->SetVisibility(ESlateVisibility::Hidden);
}
}
void UStatBar::SetBarColor(EBarColor _colorID)
{
int32 colorID = (int32)_colorID;
if(!m_base)
return;
if((colorID & 0x80) != 0)
{
colorID = colorID & 0x7F;
colorID = FMath::Clamp(colorID, 0, (int32)(sizeof(barTextures) / sizeof(UTexture2D*)));
m_base->SetBrushFromMaterial(textureBarMaterialClass);
m_blocked->SetBrushFromMaterial(textureBarMaterialClass);
m_damage->SetBrushFromMaterial(textureBarMaterialClass);
UMaterialInstanceDynamic* baseMat = m_base->GetDynamicMaterial();
baseMat->SetTextureParameterValue("Texture", barTextures[colorID]);
baseMat = m_damage->GetDynamicMaterial();
baseMat->SetTextureParameterValue("Texture", barTextures[colorID]);
baseMat = m_blocked->GetDynamicMaterial();
baseMat->SetTextureParameterValue("Texture", barTextures[colorID]);
}
else
{
colorID = FMath::Clamp(colorID, 0, (int32)(sizeof(barColors) / sizeof(FLinearColor)));
UMaterialInstanceDynamic* baseMat = m_base->GetDynamicMaterial();
baseMat->SetVectorParameterValue("Color", barColors[colorID]);
}
}