2014-06-14 2 views
0

맨손으로 게임 상태 시스템을 해결했지만 개선 방법에 대한 조언이 필요합니다. 나는 모든 게임 상태가 상속받은 GameState.h를 가지고있다. 그러므로 나는이 게임의 벡터를 저장하는 클래스가이 게임 상태지만 팝/푸시 (_back) 등의 사용 기능을 처리C++ 게임 - 게임 상태를 두 번 이상 초기화해야합니까?

std::vector<GameState *> gameStates; 

언급 한 게임 상태를 관리 할 수 ​​있습니다. 순간

내가 이렇게 내 게임 상태를 만드는 오전 :

.H

GameState *mainMenu = nullptr; 
GameState *inGame = nullptr; 

을 cpp를

mainMenu = new MainMenuState(); 
inGame = new InGameState(); 

다음과 같이 그들을 초기화 :

mainMenu->initialize(this, camera); 
inGame->initialize(this, camera); 

다음에 th 이 같은 벡터에 EM :

setCurrentGameState(mainMenu); 

내가 그것을해야

나는 이미 그 일을하고 같은 또는 다음과 같이 :

setCurrentGameState(new MainMenuState(this, camera)); 

내가 게임의 시작에서 게임의 모든 상태를 초기화해야하거나 벡터에 푸시 될 때 초기화해야합니까? 그런 다음 다시 튀김이 삭제됩니다. 과거에는 푸시 할 때 초기화하려고 시도했지만 메모리를 훨씬 더 많이 처리합니다. 그러나 게임의 시작이 성능을 저해하는 모든 게임 상태를 초기화하겠습니까?

+1

귀하의 경우 두 가지 악의 어느 것이 더 나은지를보고 프로필을 확인하십시오. – keltar

+0

원시 포인터를 전혀 사용하지 않겠습니다. 대신 std :: shared_ptr <>'또는'std :: unique_ptr <>'을 사용하십시오. 친절한 조언; 일반 게임 엔진을 만들지 마십시오. 제대로 작동하려면 많은 시간이 필요합니다. 다른 여러 사람들과 함께 작업하지 않는 한 단일 게임에 집중하는 것이 훨씬 낫습니다. – olevegard

+0

감사합니다 owvegard, Std :: Shared_ptr 또는 std :: uniquire_ptr를 사용하면 어떤 이점이 있습니까? 그리고 나는 그들을 어디에서 사용해야합니까? –

답변

1

내 경험으로 말할 수있는 것은 : 게임의 크기에 따라 다릅니다.

약간의 제안. 여러 개의 FSM으로 게임을 나눌 수 있습니다. 하나는 메인 메뉴/옵션/크레딧 파트 용이고 다른 하나는 "실제"게임 파트 용입니다. 이 방법으로 현재 사용중인 FSM의 모든 상태를 인스턴스화하고 관련 메서드를 호출하여 활성화 할 수 있습니다.

하나의 작은 아키텍처 예 : 사용자 정의 FSM의 각각에 대해

class State 
{ 
public: 
    virtual void OnEnter() = 0; 
    virtual void OnUpdate(float i_fTime) = 0; 
    virtual void OnExit() = 0; 
}; 

class FSM 
{ 
public: 
    /* 
     here you call onenter for the state where you want 
     to go and onexit for the current state 
    */ 
    virtual void GoToState(const std::string& state_name) = 0; 

    /* 
     here you call OnUpdate method on m_pCurrentState 
    */ 
    virtual void Update(float i_fTime) = 0; 

private: 
    State* m_pCurrentState; 
    std::map<std::string, State*> m_mStates; 
}; 

class FSMSystem 
{ 
public: 
    void SetCurrentFSM(FSM* i_pFSM); 
    void Update(float i_fTime); 

private: 
    FSM* m_pCurrentFSM; 
}; 

, 당신은 FSM 인터페이스를 구현해야합니다. 각 사용자 정의 상태에 대해 State 클래스를 구현해야합니다.

FSM을 생성하는 동안 생성자 (또는 init 메서드) 내부에서 상태를 초기화하십시오. 무거운 물건 (예 : 텍스처로드/복잡한 알고리즘 또는 OnEnter 메서드에 비슷한 요청)을 둡니다.