⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamestate.cpp.svn-base

📁 坦克大战游戏完整全套源代码
💻 SVN-BASE
字号:
#include <cassert>

#include "hge.h"

#include "common/gameState.h"
#include "common/profile.h"

void GameState::OnEnter()
{
}

void GameState::OnLeave()
{
}

void GameState::SetName(const string &name)
{
    if (!GameStateManager::getSingleton().FindState(name))
    {
        this->name = name;
    }
}

GameStateManager::GameStateManager() : curState(0)
{
    HGE *hge = hgeCreate(HGE_VERSION);
    assert(hge);
    hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
    hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
    hge->Release();
}

GameStateManager::~GameStateManager()
{
    // must call releaseSingleton before me
    assert(!curState);
}
void GameStateManager::releaseSingleton()
{
    if (curState)
    {
        curState->OnLeave();
        curState = 0;
    }
}

GameState *GameStateManager::FindState(const string &name) const
{
    for (vector<GameState *>::const_iterator s = states.begin(); s != states.end(); ++s)
    {
        if ((*s)->GetName() == name)
            return *s;
    }
    return 0;
}

void GameStateManager::RegisterState(GameState *state)
{
    assert(state);
    assert(!state->GetName().empty());
    assert(0 == FindState(state->GetName()));
    states.push_back(state);
}

void GameStateManager::RequestState(const string &name)
{
    assert(requestState.empty()); // already requested
    requestState = name;
}

bool GameStateManager::OnFrame()
{
#if USE_PROFILER
    Profile::getSingleton().flushFrame();
#endif
    if (!requestState.empty())
    {
        if (curState)
        {
            curState->OnLeave();
            curState = 0;
        }
        if (requestState == "exit")
            return true;
        curState = FindState(requestState);
        requestState.clear();
        if (curState)
            curState->OnEnter();
    }

    if (curState)
        curState->OnFrame();

    return false;
}

static bool FrameFunc()
{
    return GameStateManager::getSingleton().OnFrame();
}

static bool RenderFunc()
{
    GameState *gs = GameStateManager::getSingleton().curState;
    if (gs)
    {
        gs->OnRender();
    }
    return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -