2013-10-27 2 views
5

Итак, я старался следовать за пустым ведомым руководством по назначению двигателя в университете, и у меня возникли проблемы с разработкой способов использования моего для доступа и обновите состояние в верхней части стека, также известное как TopState в моем коде.GameStateManager: как указывать и обновлять текущее состояние

Это довольно просто, я инициализацию и запустить двигатель в main и установить и нажмите на первое состояние:

void main() 
{ 
    EApplication::Init(); 

    EApplication* pApp = new EApplication(); 

    pApp->GetGameStateManager()->SetState("TEST", new ETestState(pApp)); 

    pApp->GetGameStateManager()->PushState("TEST"); 

    pApp->GetGameStateManager()->UpdateGameStates(ETime::deltaTime); 

    EApplication::RunApp(); 
    delete pApp; 
} 

однако, как вы можете увидеть ниже функции UpdateGameStates в моем GameStateManager пока ничего делать, потому что я не уверен, как получить доступ или точки текущего состояния, и, таким образом, вызвать его собственную соответствующую Update функции:

GameStateManager:

#include "AppGSM\EGamestateManager.h" 

EGameStateManager::EGameStateManager(){ topState = new char[8]; } 

EGameStateManager::~EGameStateManager(){} 

void EGameStateManager::SetState(const char *szName, EBaseGameState *state){} 

void EGameStateManager::PushState(const char *szName){} 

void EGameStateManager::PopState(){} 

void EGameStateManager::ChangeState(const char *szName){} 

const char* EGameStateManager::GetTopStateName() 
{ 
    return topState; 
} 

EBaseGameState* EGameStateManager::GetTopState() 
{ 

} 

void EGameStateManager::UpdateGameStates(float deltaTime) 
{ 


} 

void EGameStateManager::DrawGameStates(){} 

Мне просто интересно, что я должен указывать на то, когда я пытаюсь использовать GetTopState() и как получить доступ к функции обновления этого состояния?

+4

Ничего себе, правильно отформатированный код вместо кучи дерьма. Не видели этого с первого раза пользователя. Поздравляем с тем, что вы не являетесь зомби;) – BartoszKP

+0

Я думаю, было бы неплохо начать с ваших методов детерминированного состояния (а именно «SetState», «PushState» и т. Д.) ... или я пропустил вашу точку? – Kiruse

+0

Почему 'pApp-> GetGameStateManager() -> Whatever();' ... довольно многословно, почему бы и нет: 'GameStateManager & gs = * pApp-> GetGameStateManager(); gs.Whatever(); gs.Whatever2(); 'imho это более аккуратно, и вы вводите меньше :) –

ответ

1

Как вы хотите хранить свои штаты? С «PushState» и «TopState» и т. Д. Я предполагаю, что ваш инструктор хочет, чтобы вы либо реализовали свой собственный Stack of EBaseGameState * ponters.

Последовали многие предположения. Я полагаю, что EBaseGameState - это просто абстрактный тип данных, и вам нужно реализовать все разные состояния, которые наследуются от этого состояния. И поэтому простой способ получить доступ к функции обновления этого состояния будет иметь следующее:

class EBaseGameState 
{ 
    public: 
    //other functions omitted 
    virtual void Update(float deltaTime) = 0; 

}; 

class MenuState : EBaseGameState 
{ 
    public: 
    //other functions and implementation of Update() omitted 
    void Update(float deltaTime); 
} 

Затем в коде вызова было бы так просто, как

void EGameStateManager::UpdateGameStates(float deltaTime) 
{ 
    topStatePointer->Update(deltaTime); 
} 

Хороший способ реализации стек использует Vector и просто добавляет новые состояния в обратную сторону и выскакивает состояния с обратной стороны, когда это необходимо, однако почему вы сохраняете имя состояния вне меня. Ваш инструктор хочет, чтобы вы проверили имена? Я попросил бы его/ее уточнить

Смежные вопросы