2016-03-02 60 views
0

希望有人能引导我走向正确的方向。并提前道歉,因为我只是一名学生。C++ OpenGL:如何使加载屏幕状态转换到游戏级别状态?

我想为我的项目做什么,我正在试图让我的基本加载屏幕过渡到游戏关卡屏幕。所以我想要做的是,一旦加载屏幕被激活(或已经出现在屏幕上),我想在这一点上开始加载我的游戏状态。目前正在做的是在开始时加载所有内容,这需要一段时间。

所以目前我的项目从主菜单开始。然后当我按下输入,它开始加载屏幕。我已经使用按键像这样我的操作状态变化:

void Game::update() 
{ 
    static bool enterPreviouslyPressed = false; 
    static bool escapePreviousPressed = false; 

    const Uint8 *keys = SDL_GetKeyboardState(NULL); 

    if (keys[::SDL_SCANCODE_ESCAPE] && !escapePreviousPressed && typeid(*fsm->getState()) == typeid(GameState)) 
    { 
     fsm->setState(menuState); 
    } 
    else if (keys[::SDL_SCANCODE_RETURN] && !enterPreviouslyPressed && typeid(*fsm->getState()) == typeid(MainMenuState)) 
    { 
     fsm->setState(loadingState); 
    } 
    else if ((keys[::SDL_SCANCODE_RETURN] && !enterPreviouslyPressed) && typeid(*fsm->getState()) == typeid(LoadScreenState)) 
    { 
     fsm->setState(gameState); 
    } 
    else if (keys[::SDL_SCANCODE_ESCAPE] && !escapePreviousPressed && typeid(*fsm->getState()) == typeid(MainMenuState)) 
    { 
     exit(0); 
    } 

    enterPreviouslyPressed = keys[::SDL_SCANCODE_RETURN] != 0; 
    escapePreviousPressed = keys[::SDL_SCANCODE_ESCAPE] != 0; 

    fsm->update(); 
} 

我这样做最初这是否使我可以手动更改状态检查一切正常。我想知道是否有一个简单的(ish)方式,比如布尔标志或其他更简单的方法来实现。我无法在网上找到任何教程,所以想知道是否有人知道如何做到这一点的最佳解决方案。我在这里看到了一个问题,kindda类似,但我不确定它是否回答了我的问题,因为这个人在我不熟悉的线程中这样做。道歉,如果我似乎没有正确的逻辑 - 所以请告知,否则,或者如果有人知道我在哪里可以看到示例代码,那么任何援助表示赞赏。

如果有人能提供帮助,请提前致谢。

+0

问题是什么是什么呢?你想知道是否有更简单的方法来处理状态机? – JojOatXGME

回答

0

看起来相当标准,但我会通过保持声明为类变量二的键盘状态变量,如简化它:

const Uint8 *curKeys = SDL_GetKeyboardState(NULL), *prevKeys; 

// ... 

void Game::update() { 

    prevKeys = curKeys; 
    curKeys = = SDL_GetKeyboardState(NULL); 

    //and so then compare curKeys to prevkeys 
    //and ditch the booleans 
    // ... 
}