terça-feira, 11 de agosto de 2020

Criando a função ItemCollected em C++

No artigo anterior, vimos os conceitos básicos de operadores e condicional if. Neste artigo, vamos ver estes conceitos na prática ao implementar a função ItemCollected() na classe C++ ATutoProjectGameMode

Esta função será chamada pela classe TutoProjectCollectable quando o jogador coletar um item no jogo. Em nosso jogo, um item é representado visualmente por uma estátua, mas veremos em outro artigo como mudar a aparência dele. 

A função
ItemCollected() deve fazer as seguintes ações:
  • Adicionar à pontuação do jogador, os pontos obtidos ao coletar um item que é calculado pela expressão 10 X Nível do Jogador.
  • Adicionar 1 à variável ItemCount que armazena a quantidade de itens que foram coletados.
  • Testar se o valor da variável ItemCount é múltiplo de 5. Se for verdadeiro faça as ações abaixo:
    • Adicionar 15 à variável Time (tempo).
    • Adicionar 1 à variável PlayerLevel (nível do jogador). Limitar o valor máximo do nível do jogador em 5.

A cada 5 itens coletados o jogador aumenta um nível e ganha 15 segundos de tempo.

A declaração da função ItemCollected() é feita no arquivo cabeçalho TutoProjectGameMode.h abaixo da declaração da função StartGame() como mostra o trecho de código abaixo. A função ItemCollected() é public porque ela será chamada por outra classe C++. 
...

UCLASS(minimalapi)
class ATutoProjectGameMode : public AGameModeBase
{
	GENERATED_BODY()

public:
	ATutoProjectGameMode();

	void StartGame();

	void ItemCollected();

...
Eu uso reticências ... para indicar que o código fonte exibido não está completo. 

O corpo da função ItemCollected() deve ser colocado no arquivo TutoProjectGameMode.cpp abaixo da função BeginPlay():
...

void ATutoProjectGameMode::BeginPlay()
{
	Super::BeginPlay();

	StartGame();
}

void ATutoProjectGameMode::ItemCollected()
{
	Score += PlayerLevel * 10;
	ItemCount++;

	if (ItemCount % 5 == 0)
	{
		Time += 15;

		if (PlayerLevel < 5)
		{
			PlayerLevel++;
		}
	}
}

Vamos analisar cada um das ações feitas pela função ItemCollected() junto com o código fonte equivalente.

  • Adicionar à pontuação do jogador, os pontos obtidos ao coletar um item que é calculado pela expressão 10 X Nível do Jogador.
Score += PlayerLevel * 10;
Estou usando a forma abreviada += que é um operador aritmético junto com o operador de atribuição. O operador += soma o resultado da expressão que está à direita ao valor atual da variável Score.

Uma das vantagens da linguagem C++ em relação à Blueprints é a escrita de expressões. Expressões complexas podem ser escritas em uma única linha de código C++, enquanto que em Blueprints a mesma expressão precisará de muitos nodes para ser escrita. 

  • Adicionar 1 à variável ItemCount que armazena a quantidade de itens que foram coletados.
ItemCount++;
Estou usando o operador de incremento ++ que soma 1 ao valor atual da variável ItemCount.

  • Testar se o valor da variável ItemCount é múltiplo de 5. Se for verdadeiro faça as ações abaixo.
if (ItemCount % 5 == 0)
O bloco de código abaixo do condicional if que é delimitado pelas chaves { } só será executado se o resultado da expressão que está dentro do parênteses for true (verdadeiro). Na expressão estou usando o operador % que retorna o resto da divisão. O operador % é conhecido como Módulo. Quando ItemCount tiver um valor que seja múltiplo de 5, o resto da divisão por 5 será 0. O operador % tem precedência em relação ao operador ==, então o resto da divisão é feito antes da comparação com 0.

    • Adicionar 15 à variável Time (tempo).
Time += 15;
Esta linha concede ao jogador mais 15 segundos de tempo no jogo.

    • Adicionar 1 à variável PlayerLevel (nível do jogador). Limitar o valor máximo do nível do jogador em 5.
if (PlayerLevel < 5)
{
	PlayerLevel++;
}
Estou usando o condicional if para evitar que o nível do jogador fique maior que 5.