Klasa TutoProjectHUD – napisanie funkcji na ekranie

W tym artykule dowiesz się, jak wyrenderować tekst na ekranie za pomocą klasy typu HUD.

HUD jest skrótem od nazwy Heads-Up Display. Informacje, które chcemy dodać na ekranie będą następujące:

W klasie AHUD istnieje zdarzenie o nazwie DrawHUD (), które jest wykonywane w każdej klatce. To w tym przypadku umieszczamy funkcje, które wygenerują napisy na ekranie. Musimy nadpisać zdarzenie DrawHUD() w klasie ATutoProjectHUD.

Otwórz plik TutoProjectHUD.h i dodaj deklarację funkcji DrawHUD() poniżej w funkcji BeginPlay ():

...

protected:

	class ATutoProjectGameMode* TutoProjectGameMode;

	virtual void BeginPlay() override;
    
	virtual void DrawHUD() override;
		
};

Aby zdefiniować położenie, w którym elementy będą rysowane w HUD, używamy współrzędnych ekranu, które nazywamy ScreenX i ScreenY. Te współrzędne reprezentują piksel na ekranie, a początek znajduje się w lewym górnym rogu. Następny obraz pokazuje, jak zmieniają się wartości ScreenX i ScreenY.

Klasa AHUD ma zmienną o nazwie Canvas, która jest wskaźnikiem do klasy UCanvas. Jeśli chcesz poznać rozmiar ekranu dostępny do rysowania, uzyskaj dostęp do zmiennych SizeX i SizeY w następujący sposób:

Canvas->SizeX;
Canvas->SizeY;

Zobaczmy teraz, jak przygotować tekst, który zostanie wyrenderowany na ekranie. Poniższy wiersz kodu tworzy zmienną o nazwie TextHUD, która będzie przechowywać wynik: tekst oraz bieżącą wartość zmiennej Score, która jest uzyskiwana z klasy TutoProjectGameMode.

FString TextHUD = FString::Printf(TEXT("Score: %d"), TutoProjectGameMode->GetScore());

Spójrzmy na części tego zadania:

  • FString TextHUD : Definicja zmiennej TextHUD. FString to klasa Unreal Engine używana do przechowywania tekstu.
  • FString::Printf(): Printf () jest funkcją klasy FString, która zwraca instancję FString utworzoną z tekstu szablonu ze zmiennymi wartościami wstawionymi do tekstu szablonu.
  • TEXT (“Score: %d”): To pierwszy parametr funkcji Printf (). Znaki %d zostaną zastąpione wartością zmiennej, która znajduje się w drugim parametrze funkcji Printf(). TEXT() to makro używane w celu zapewnienia zgodności między standardami ANSI i UNICODE.
  • TutoProjectGameMode->GetScore(): To drugi parametr funkcji Printf(). Funkcja GetScore () zwraca wartość zmiennej Score klasy TutoProjectGameMode. Ta wartość zostanie wstawiona tam, gdzie znajdują się znaki% d.

Klasa AHUD ma funkcję o nazwie DrawText(), której będziemy używać do renderowania informacji o stanie naszej gry na ekranie. W poniższym wierszu funkcja DrawText () renderuje zawartość zmiennej TextHUD na żółto we współrzędnych ekranu (10, 10).

DrawText(TextHUD, FColor::Yellow, 10, 10, nullptr, 3.0f, false);

Słowo nullptr jest pustym wskaźnikiem, który jest przekazywany w parametrze Font. Gdy Font ma wartość null, funkcja DrawText() używa domyślnej czcionki (roboto). Parametr o wartości 3.0f jest typem float (decimal) i reprezentuje skalę, która zmienia rozmiar czcionki. Ostatnim parametrem o wartości false jest wskazanie, czy waga powinna modyfikować pozycję.

Parametry funkcji DrawText() są równoważne parametrom dostępnym w węźle Blueprint Draw Text:

Otwórz plik TutoProjectHUD.cpp i dodaj definicję funkcji DrawHUD() z instrukcjami, aby narysować wartości Score, Time i PlayerLevel.

void ATutoProjectHUD::DrawHUD()
{
  Super::DrawHUD();  

  FString TextHUD = FString::Printf(TEXT("Score: %d"), TutoProjectGameMode->GetScore());
  DrawText(TextHUD, FColor::Yellow, 10, 10, nullptr, 3.0f, false);

  TextHUD = FString::Printf(TEXT("Time: %d"), TutoProjectGameMode->GetTime());
  DrawText(TextHUD, FColor::Red, 300, 10, nullptr, 3.0f, false);

  TextHUD = FString::Printf(TEXT("Player Level: %d"), TutoProjectGameMode->GetPlayerLevel());
  DrawText(TextHUD, FColor::Blue, 550, 10, nullptr, 3.0f, false);
}

Zauważ, że ta sama zmienna TextHUD jest używana w trzech wykonaniach funkcji DrawText() i że jej definicja z typem FString została wykonana tylko w pierwszym wierszu użycia zmiennej.


Źródło:https://romeroblueprints.blogspot.com/2020/08/tutoprojecthud-class-drawing-on-screen.html