// Project Lab - NHTV Igad #include "UnrealProject.h" #include "CombatTextWidget.h" #include "CombatTextText.h" #include "WidgetLayoutLibrary.h" #define TEXT_LIFETIME 1.0f void UCombatTextWidget::NativeConstruct() { Super::NativeConstruct(); } void UCombatTextWidget::NativeDestruct() { Super::NativeDestruct(); } void UCombatTextWidget::NativeTick(const FGeometry& geometry, float deltaTime) { Super::NativeTick(geometry, deltaTime); UWorld* const world = GetWorld(); if (!IsValid(world)) return; APlayerController* const controller = world->GetFirstPlayerController(); if (!IsValid(controller)) return; const FVector2D screenSize = FVector2D(world->GetGameViewport()->Viewport->GetSizeXY().X, world->GetGameViewport()->Viewport->GetSizeXY().Y); const float viewportScale = UWidgetLayoutLibrary::GetViewportScale(this); for (int32 i = 0; i < m_combatTexts.Num();) { // Check the lifetime CombatText& text = m_combatTexts[i]; text.lifeTime += deltaTime; if (text.lifeTime >= TEXT_LIFETIME) { text.textObject->RemoveFromParent(); m_combatTexts.RemoveAt(i); continue; } // Set the color UCanvasPanelSlot* asSlot = Cast(text.textObject->Slot); if (asSlot) { const float progress = text.lifeTime / TEXT_LIFETIME; text.textObject->SetColor(FLinearColor(text.color.R, text.color.G, text.color.B, text.color.A * (1.0f - progress))); // Update position FVector2D position; if (controller->ProjectWorldLocationToScreen(text.position + FVector(0, 0, progress * 200), position)) { if (text.arc) { position -= FVector2D(progress * text.arcDir.X, FMath::Sin(progress * PI) * text.arcDir.Y) * 100; asSlot->SetPosition(position / viewportScale); } else asSlot->SetPosition(position / viewportScale); } } i++; } } void UCombatTextWidget::CreateCombatText(const FVector& position, const FString& text, const FLinearColor& color) { CombatText combatText(position, text, color, false); combatText.textObject = m_CreateTextObject(text, color); m_combatTexts.Add(combatText); } void UCombatTextWidget::CreateArcingCombatText(const FVector& position, const FString& text, const FLinearColor& color) { CombatText combatText(position, text, color, true); combatText.arcDir.X = FMath::SRand() * 0.5f + 0.3f; combatText.arcDir.Y = FMath::SRand() * 0.5f + 0.3f; if (FMath::Rand() % 2 == 0) combatText.arcDir.X = -combatText.arcDir.X; combatText.textObject = m_CreateTextObject(text, color); m_combatTexts.Add(combatText); } UCombatTextText* UCombatTextWidget::m_CreateTextObject(const FString& text, const FLinearColor& color) { UCombatTextText* newObject = CreateWidget(GetWorld(), textWidget); canvas->AddChild(newObject); UCanvasPanelSlot* asSlot = Cast(newObject->Slot); asSlot->SetSize(FVector2D(1000, 500)); asSlot->SetAlignment(FVector2D(0.5f, 0.05f)); newObject->SetText(text); newObject->SetColor(color); return newObject; }