C++ Switch Statement

Instrukcja switch służy do wybierania i wykonywania danego bloku kodu na podstawie wartości zmiennej. Zmienna może być liczbą całkowitą lub wyliczeniem.

Poniższy przykład przedstawia przykład polecenia przełącznika. Zmienna jest typu Int32 i może przechowywać wartości 1, 2 i 3, które przedstawiają trudności gry. TotalEnemies jest również zmienną typu int32 . Wartość zmiennej Trudność określi wartość zmiennej 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;		 
} 

Instrukcja break służy do wskazania końca bloku kodu dla każdego przypadku. Instrukcja default jest opcjonalna i jest wykonywana, gdy wartość nie zostanie znaleziona.

W przykładzie użycia zobaczymy, jak używać instrukcji switch z wyliczeniem.

Przykładowe użycie:

Zamierzamy stworzyć Enum o nazwie EDifulty, które będzie używane do reprezentowania trudności w grze. Utwórz plik nagłówkowy Difficulty.h i dodaj ten kod:

#pragma once

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

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

W edytorze Unreal utwórz klasę C ++ o nazwie EnemySpawner, używając klasy Actor jako klasy nadrzędnej. Ta klasa ma zmienną typu int32 o nazwie TotalEnemies i zmienną wyliczającą typu EDifficulty o nazwie GameDifficulty. Wartość TotalEnemies zostanie ustawiona w funkcji BeginPlay () za pomocą instrukcji switch z wyliczeniem GameDifficulty

Plik EnemySpawner.h musi mieć następującą zawartość:

#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;

};

Oto zawartość pliku  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);
}

Skompiluj kod C++ i dodaj instancję EnemySpawner na poziomie. Możesz wybrać wartość GameDifficulty na karcie Details instancji.


Źródło:https://romeroblueprints.blogspot.com/2020/12/the-c-switch-statement.html