Neste artigo vamos ver como desenhar texto na tela usando uma classe do tipo HUD. Caso você não saiba, HUD é a abreviação de Heads-Up Display.
As informações que queremos desenhar na tela são estas:
Existe um evento da classe AHUD chamado DrawHUD() que é executado a cada frame. É neste evento que colocamos as funções que desenham na tela. Precisamos sobrescrever o evento DrawHUD() na classe ATutoProjectHUD.
Abra o arquivo TutoProjectHUD.h e adicione a declaração da função DrawHUD() abaixo da função BeginPlay():
...
protected:
class ATutoProjectGameMode* TutoProjectGameMode;
virtual void BeginPlay() override;
virtual void DrawHUD() override;
};
Para definir a posição onde os elementos serão desenhados no HUD, nós usamos coordenadas de tela que são chamadas de ScreenX e ScreenY. Estas coordenadas representam um pixel da tela e a origem fica na posição superior esquerda. A próxima imagem mostra como ocorre a variação dos valores de ScreenX e ScreenY.
A classe AHUD possui uma variável chamada Canvas que é um ponteiro para a classe UCanvas. Se você precisar saber qual o tamanho da tela disponível para desenho, acesse as variáveis SizeX e SizeY assim:
Canvas->SizeX;
Canvas->SizeY;
Agora vamos ver como preparar o texto que será desenhado na tela. A linha de código abaixo cria uma variável chamada TextHUD que irá armazenar o texto Score: mais o valor atual da variável Score que é obtido da classe TutoProjectGameMode.
FString TextHUD = FString::Printf(TEXT("Score: %d"), TutoProjectGameMode->GetScore());
Vamos analisar esta atribuição por partes:
- FString TextHUD : Definição da variável TextHUD. FString é uma classe da Unreal Engine usada para armazenar texto.
- FString::Printf() : Printf() é uma função da classe FString que retorna uma instância de FString criada a partir de um texto modelo com valores de variáveis que são inseridos dentro do texto modelo.
- TEXT("Score: %d") : Este é o primeiro parâmetro da função Printf(). Os caracteres %d serão substituídos pelo valor da variável que está no segundo parâmetro do Printf(). TEXT() é uma macro usada para garantir compatibilidade entre os padrões ANSI e UNICODE.
- TutoProjectGameMode->GetScore() : Este é o segundo parâmetro da função Printf(). A função GetScore() retorna o valor da variável Score da classe TutoProjectGameMode. Este valor será colocado no local onde estão os caracteres %d.
A classe AHUD possui uma função chamada DrawText() que vamos usar para desenhar as informações do jogo na tela. Na linha de código abaixo, a função DrawText() está desenhando o conteúdo da variável TextHUD usando a cor amarela, na coordenada de tela (10, 10).
DrawText(TextHUD, FColor::Yellow, 10, 10, nullptr, 3.0f, false);
A palavra nullptr é um ponteiro nulo que está sendo passado no parâmetro da Fonte. Quando a Fonte é nula, a função DrawText() usa a Fonte padrão. O parâmetro com o valor 3.0f é do tipo float (decimal) e representa uma escala que modifica o tamanho da Fonte. O último parâmetro com o valor false é para indicar se a escala deve modificar a posição.
Os parâmetros da função DrawText() equivalem aos parâmetros disponíveis no node Blueprint Draw Text:
Abra o arquivo TutoProjectHUD.cpp e adicione a definição da função DrawHUD() com os comandos para desenhar os valores de Score, Time e 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);
}
Observe que a mesma variável TextHUD está sendo usada nas três execuções de DrawText() e que a sua definição com o tipo FString só ocorreu na primeira linha de uso da variável.