quarta-feira, 2 de dezembro de 2020

O comando switch em C++

O comando switch é usado para selecionar e executar um determinado bloco de código baseado no valor de uma variável. A variável pode ser do tipo inteiro ou uma enumeração.

O exemplo abaixo mostra um exemplo de comando switch. A variável Difficulty é do tipo int32 e ela pode armazenar os valores 1, 2 e 3, que representam a dificuldade do jogo. TotalEnemies também é uma variável do tipo int32. O valor da variável Difficulty irá determinar o valor da variável TotalEnemies.

switch ( Difficulty )
{
    
  case 1:
	  
       TotalEnemies = 20;
       break;

  case 2:
	  
       TotalEnemies = 30;
       break;

  case 3:
	  
       TotalEnemies = 40;
       break;

  default:
	  
       UE_LOG(LogTemp, Warning, TEXT("Difficulty variable: Invalid value."));
       break;		 
} 

O comando break é usado para indicar o fim da seqüência de comandos de cada caseO comando default é opcional e é executado quando não for encontrado um valor correspondente.

No exemplo de uso veremos como usar o comando switch com uma enumeração.


Exemplo de uso:

Vamos criar uma enumeração chamada EDifficulty que será usada para representar a dificuldade no jogo. Crie o arquivo cabeçalho Difficulty.h e adicione este código:

#pragma once

#include "CoreMinimal.h"
#include "Difficulty.generated.h"

UENUM( BlueprintType )
enum EDifficulty
{
  VeryEasy,
  Easy,
  Normal,
  Hard,
  VeryHard
}; 

No editor da Unreal, crie uma classe C++ com o nome EnemySpawner usando como classe pai a classe Actor. Esta classe possui uma variável do tipo int32 chamada TotalEnemies e uma variável de enumeração do tipo EDifficulty chamada GameDifficulty. O valor de TotalEnemies será definido na função BeginPlay() usando um comando switch com a enumeração GameDifficulty.   

O arquivo EnemySpawner.h deve ter este conteúdo:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Difficulty.h"
#include "EnemySpawner.generated.h"

UCLASS()
class TUTOPROJECT_API AEnemySpawner : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AEnemySpawner();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	int32 TotalEnemies;
	
	UPROPERTY(EditAnywhere, Category=EnemySpawner)
	TEnumAsByte< EDifficulty > GameDifficulty;
	
	UPROPERTY(VisibleAnywhere)
	USceneComponent* RootScene;

	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* StaticMesh;

};

Este é o conteúdo do arquivo EnemySpawner.cpp:

#include "EnemySpawner.h"

AEnemySpawner::AEnemySpawner()
{
  // Set this actor to call Tick() every frame.
  PrimaryActorTick.bCanEverTick = true;

  RootScene = CreateDefaultSubobject<USceneComponent>("RootScene");
  RootComponent = RootScene;

  StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMesh");
  StaticMesh->SetupAttachment(RootScene);
}

// Called when the game starts or when spawned
void AEnemySpawner::BeginPlay()
{
  Super::BeginPlay();

  switch ( GameDifficulty )
  {
    case EDifficulty::VeryEasy:
	  
         TotalEnemies = 10;
         break;

    case EDifficulty::Easy:
	  
         TotalEnemies = 20;
         break;

    case EDifficulty::Normal:
	  
         TotalEnemies = 30;
         break;

    case EDifficulty::Hard:
	  
         TotalEnemies = 40;
         break;

    case EDifficulty::VeryHard:
	  
         TotalEnemies = 50;
         break;		 
  }

  FString Message = FString::Printf(TEXT("TotalEnemies: %d"), TotalEnemies);
  
  if(GEngine)
  {
    GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, Message);
  }
  
}

// Called every frame
void AEnemySpawner::Tick(float DeltaTime)
{
  Super::Tick(DeltaTime);
}

Compile o código C++ e adicione uma instância de EnemySpawner no nível. Você pode selecionar o valor de GameDifficulty na aba Details da instância.



Sumário C++