Tworzenie Pierwszej Funkcji C++

Stwórzmy zatem funkcję w C++ o nazwie StartGame(). Po nazwie funkcji zawsze występują nawiasy. Funkcja ma jedną lub więcej instrukcji, które zostaną wykonane po wywołaniu funkcji.

Funkcja StartGame() jest częścią klasy TutoProjectGameMode i jest odpowiedzialna za przypisywanie początkowych wartości zmiennych stanu gry, które zostały utworzone w poprzednim artykule. Ta funkcja jest wywoływana na początku gry i po jej zakończeniu, jeśli gracz chce grać w nią ponownie.

Declaration (Deklaracja) funkcji informuje kompilator o nazwie funkcji, otrzymywanych parametrach i typie zwracanej wartości. Deklaracja funkcji jest wykonywana w pliku nagłówkowym (.h).

Definition (Definicja) funkcji zapewnia treść funkcji zawierającej instrukcje. Definicja funkcji jest wykonywana w pliku implementacji (.cpp).

Funkcja StartGame() będzie public (publiczna), ponieważ będzie również używana przez klasę C ++, która reprezentuje gracza, gdy chce on ponownie uruchomić grę. Deklarację tej funkcji umieścimy w pliku TutoProjectGameMode.h po deklaracji konstruktora ATutoProjectGameMode(), jak pokazano w kodzie poniżej. Zauważ, że istnieje również deklaracja funkcji BeginPlay(). Na końcu tego artykułu skomentujemy BeginPlay().

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "TutoProjectGameMode.generated.h"

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

public:
	ATutoProjectGameMode();

	void StartGame();

protected:
	int32 PlayerLevel;

	int32 Score;

	int32 ItemCount;

	int32 Time;

	bool  bGameOver;
    
	virtual void BeginPlay() override;
};

Keyword Void znajdujący się przed nazwą funkcji StartGame() oznacza, że funkcja ta nie zwraca wartości. Pusty nawias oznacza, że funkcja nie ma parametrów. Parametry są używane do przekazywania wartości podczas wykonywania funkcji. Na przykład, gdybyśmy chcieli, aby funkcja StartGame() otrzymywała wartość całkowitą wskazującą poziom trudności, deklaracja funkcji wyglądałaby następująco:

 void StartGame(int32 DifficultyLevel);

Parametr DifficultyLevel działa jako zmienna, której można używać w funkcji StartGame (). To był tylko przykład parametru, nie rób tej zmiany w naszym kodzie gry.

Treść funkcji StartGame() zawierającej instrukcje należy umieścić w pliku TutoProjectGameMode.cpp. Ten plik ma już treść konstruktora ATutoProjectGameMode(), który został utworzony przez szablon trzeciej osoby.

Plik TutoProjectGameMode.cpp będzie wyglądał następująco:

// Copyright Epic Games, Inc. All Rights Reserved.

#include "TutoProjectGameMode.h"
#include "TutoProjectCharacter.h"
#include "UObject/ConstructorHelpers.h"

ATutoProjectGameMode::ATutoProjectGameMode()
{
 // set default pawn class to our Blueprinted character
 static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(
        TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"));
 
 if (PlayerPawnBPClass.Class != NULL)
 {
  DefaultPawnClass = PlayerPawnBPClass.Class;
 }
}

void ATutoProjectGameMode::StartGame()
{
	Score = 0;
	PlayerLevel = 1;
	ItemCount = 0;
	Time = 30;
	bGameOver = false;
}

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

	StartGame();
}

Zauważ, że wszystkie nazwy funkcji są poprzedzone ATutoProjectGameMode ::. Znaki :: w C ++ są znane jako scope resolution operator (operatorem rozpoznawania zasięgu). W tym przykładzie jest używany do wskazania, że ​​funkcje należą do klasy C ++ ATutoProjectGameMode.

ATutoProjectGameMode () jest konstruktorem klas. Ta funkcja jest wykonywana, gdy w pamięci zostanie utworzony instance klasy ATutoProjectGameMode. Zauważ, że konstruktor nie ma słowa kluczowego definiującego zwracany typ.

W tym przykładzie konstruktor szuka klasy, która reprezentuje gracza, który ma być ustawiony jako DefaultPawnClass dla tego trybu gry. W kolejnym artykule szczegółowo przeanalizujemy te stwierdzenia.

Nasza funkcja StartGame () jest prosta, przypisuje tylko wartości początkowe do zmiennych. Znak = jest nazywany operatorem przypisania w C ++. W operacji przypisania wartość po prawej stronie operatora = jest umieszczana w zmiennej po lewej stronie operatora. W poniższym przykładzie wartość 0 jest umieszczana w zmiennej Score. Jeśli zmienna Score miała wcześniej wartość, zostanie utracona.

Score = 0;

Porozmawiajmy teraz o funkcji BeginPlay (). Jeśli już programowałeś w Blueprints, powinieneś zapoznać się z Event BeginPlay, który jest uruchamiany, gdy gra rozpoczyna się dla Actora.

Zdarzenia w Unreal Engine są implementowane w C ++ przy użyciu funkcji, które nie zwracają wartości, to znaczy, że zwracany typ jest void. Oto jak wygląda zadeklarowana funkcja BeginPlay():

virtual void BeginPlay() override;

Keyword virtual wskazuje funkcje, którą można przesłonić w klasach child. Funkcja BeginPlay() została zadeklarowana w klasie Unreal Engine C ++ AActor, więc każda klasa należąca do hierarchii AActor może zastąpić metodę BeginPlay().

Nadpisanie jest opcjonalne, ale jest bardzo przydatne. Służy do zapewnienia, że ​​programista faktycznie zastępuje funkcję klasy nadrzędnej. Programista może pomylić liczbę lub typ parametrów podczas nadpisywania funkcji. Przy użyciu zastąpienia kompilator wygeneruje błąd, jeśli w klasie nadrzędnej nie zostanie znaleziona równoważna funkcja.

W naszym przykładzie funkcja BeginPlay() ma tylko dwie instrukcje. Pierwsza instrukcja to Super :: BeginPlay (); która służy do wywoływania funkcji BeginPlay(), która została zdefiniowana w klasie nadrzędnej, którą w naszym przykładzie jest klasa C++ AGameModeBase.

Unreal Engine zdefiniował identyfikator o nazwie Super, aby odwołać się do klasy nadrzędnej, znanej również jako superclass (nadklasa). Klasy potomne są również nazywane podklasami.

Druga instrukcja to StartGame(); czyli wywołanie funkcji, którą stworzyliśmy w celu zainicjowania zmiennych.


Źródło:https://romeroblueprints.blogspot.com/2020/08/creating-first-function-in-c.html