quinta-feira, 15 de abril de 2021

EnemyCannon: Contando os Hits

Neste artigo vamos adicionar uma contagem de hits à classe EnemyCannon. Quando o número de Hits alcançar um valor máximo especificado, a instância do EnemyCannon será destruída.  

Usaremos duas variáveis inteiras. A NumHits armazenará o número de vezes que um EnemyCannon foi atingido e a MaxHits armazenará o número de hits necessário para destruir um EnemyCannon.

Usaremos o evento/função NotifyHit() para incrementar o NumHits. Este evento é chamado quando um EnemyCannon é atingido.

A destruição do canhão é feita pela função DestroyCannon(). Ela é uma UFUNCTION() do tipo BlueprintNativeEvent que permite uma implementação padrão em C++ que será usada se não for implementada a versão em Blueprint da função. Para mais informações sobre UFUNCTION(), acesse este link

A 1ª versão do arquivo EnemyCannon.h foi criada neste link. 

Adicione a declaração das novas variáveis e funções no arquivo EnemyCannon.h abaixo da função ShootCannon():

...
  FTimerHandle ShotTimerHandle;
	
  void ShootCannon();	

  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cannon)
  int32 MaxHits;
	
  UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Cannon)
  int32 NumHits;

  UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = Cannon)
  void DestroyCannon();
	
  virtual void NotifyHit(class UPrimitiveComponent* MyComp, class AActor* Other, 
          class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, 
          FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) override;

};

O próximo passo é modificar o arquivo EnemyCannon.cpp que foi criado neste link.

No construtor, inicialize a variável MaxHits com o valor 5:

FireRate = 5.f;	
MaxHits = 5;

Adicione a implementação das funções NotifyHit() e DestroyCannon_Implementation() no final do arquivo EnemyCannon.cpp:

void AEnemyCannon::NotifyHit(class UPrimitiveComponent* MyComp, class AActor* Other,
           class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation,
           FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit)
{
  Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, HitNormal, 
                   NormalImpulse, Hit);
	
  if (Cast<APlayerProjectile>(Other) != nullptr)
  {
    NumHits++;
		
    if( NumHits == MaxHits )
    {
      DestroyCannon();
    }
  }
}

void AEnemyCannon::DestroyCannon_Implementation()
{
  Destroy();
}

Na função NotifyHit() é usado um Cast<APlayerProjectile>(Other) porque só vamos contar um Hit se o EnemyCannon for atingido por um projétil do tipo APlayerProjectile (ou classes filhas).

Quando o valor da variável NumHits for igual à MaxHits, será chamada a função DestroyCannon().

Observe que a implementação da função DestroyCannon() tem o sufixo _Implementation. Este sufixo é necessário porque ela é uma BlueprintNativeEvent.


Sumário C++