sexta-feira, 21 de agosto de 2020

Classe TutoProjectGameMode: Funções Get e a nova classe HUD

Nós criamos as variáveis de estado do jogo na classe ATutoProjectGameMode com o modificador de acesso protected para evitar que outras classes C++ modifiquem diretamente os valores destas variáveis.

Entretanto, a classe ATutoProjectHUD precisa ter acesso a algumas dessas  variáveis para poder desenhar os seus valores na tela. Por isso, vamos criar algumas funções Get públicas que retornam os valores dessas variáveis.

As variáveis que precisam ser acessadas pela classe ATutoProjectHUD são PlayerLevel, Score, Time e bGameOver.

Abra o arquivo TutoProjectGameMode.h e adicione as declarações de funções do código abaixo que estão depois de void ItemCollected().
...

public:
	ATutoProjectGameMode();

	void StartGame();

	void ItemCollected();

	int32 GetPlayerLevel();

	int32 GetScore();

	int32 GetTime();

	bool  IsGameOver();

O tipo int32 antes do nome das funções indica que a função retorna um valor inteiro. Nos casos das variáveis Booleanas (true/false), a convenção para a função Get é usar Is mais o nome da variável como em IsGameOver().

As funções Get são bem simples, elas apenas retornam os valores das variáveis. Abra o arquivo TutoProjectGameMode.cpp e adicione as definições das funções no fim do arquivo conforme código abaixo.

int32 ATutoProjectGameMode::GetPlayerLevel()
{
	return PlayerLevel;
}

int32 ATutoProjectGameMode::GetScore()
{
	return Score;
}

int32 ATutoProjectGameMode::GetTime()
{
	return Time;
}

bool ATutoProjectGameMode::IsGameOver()
{
	return bGameOver;
}

Se você quiser que outras classes modifiquem o valor de uma variável protected ou private, você pode criar uma função Set pública. Não vamos precisar de funções Set na classe ATutoProjectGameMode, mas abaixo tem um exemplo de uma função Set que modifica a variável Score

void ATutoProjectGameMode::SetScore(int32 NewScore)
{
	Score = NewScore;
}

Uma das vantagens de usar uma função Set é que você pode validar o novo valor antes de armazenar na variável.

Outra mudança que precisa ser feita na classe ATutoProjectGameMode é definir que a classe ATutoProjectHUD será usada como HUD do jogo. Isto é feito no arquivo TutoProjectGameMode.cpp dentro do construtor ATutoProjectGameMode()

É preciso adicionar o #include "TutoProjectHUD.h" para que a classe ATutoProjectGameMode encontre a definição da classe ATutoProjectHUD. A atribuição da nova classe HUD é feita com esta linha: 

HUDClass = ATutoProjectHUD::StaticClass();

A função StaticClass() é uma função static que retorna uma referência da classe. Funções static pertencem à classe, ou seja, elas não precisam de uma instância para serem executada.

O início do arquivo TutoProjectGameMode.cpp fica assim:   

#include "TutoProjectGameMode.h"
#include "TutoProjectCharacter.h"
#include "UObject/ConstructorHelpers.h"
#include "TutoProjectHUD.h"

ATutoProjectGameMode::ATutoProjectGameMode()
{
  // set default pawn class to our Blueprinted character
  static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(
         TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"));
	
  if (PlayerPawnBPClass.Class != NULL)
  {
    DefaultPawnClass = PlayerPawnBPClass.Class;
  }

  HUDClass = ATutoProjectHUD::StaticClass();
}

...

A atribuição do DefaultPawnClass é diferente ao do HUDClass porque está sendo usado um Blueprint chamado ThirdPersonCharacter que foi criado pelo modelo Third Person. A classe pai deste Blueprint é a TutoProjectCharacter.

Se estas atribuições de classes do Game Mode estivesse sendo feitas em Blueprints, elas seriam feitas na aba Class Defaults:


Sumário C++