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.