segunda-feira, 24 de agosto de 2020

Classe TutoProjectHUD: Desenhando na tela

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.


Sumário C++