为什么我的游戏暂停? (Windows C ++键盘输入状态机)

时间:2011-01-13 17:36:32

标签: c++ windows

我正在使用Windows API编写一个C ++游戏,它在游戏开始之前就有一个启动画面,并且可以暂停。

我将游戏状态存储在枚举,game_state {PAUSED,PLAYING,SPLASHSCREEN}中,并依靠键盘输入来控制游戏。

游戏运行正常,在暂停和播放之间切换,但当我尝试添加启动画面以开始游戏时,暂停功能停止工作,我不知道为什么......

if(Keyboard.GetKey(VK_RETURN) && game_state == SPLASHSCREEN)  
{                                                               
    game_state = PLAYING;                                       
    Keyboard.SetKey(VK_RETURN, false);                          
}                                                             


if(Keyboard.GetKey(VK_RETURN))               
{                                               
    if(game_state == PAUSED)                    
    {                                           
        game_state = PLAYING;               
    }                                           
    else                                        
    {                                           
        game_state = PAUSED;                    
    }                                           
    Keyboard.SetKey(VK_RETURN, false);          
}                                            

//If Paused, go to Pause Screen 
if(game_state == PAUSED)
{
    pauseScreen();
}

//If Splash Screen, go to Splash Screen 
if(game_state == SPLASHSCREEN)
{
    splashScreen(); 
}

//If not paused, do game processing
if(game_state == PLAYING)
{
    gamePlay();
}

如果按住键,则GetKey()返回true。 game_state是包含游戏当前状态的枚举全局。 SetKey()将指定的键设置为down(true)或up(false)

哦,所有splashScreen()pauseScreen()和gamePlay()都是显示精灵代表每个州(目前)

setkey的

void Keyboard::SetKey(WPARAM key, bool key_down)
{
    if(key_down)
    {
        m_keys[key] = true;
    }
    else
    {
        m_keys[key] = false;
    }
}

信息getKey

bool Keyboard::GetKey(WPARAM key)
{
    if(m_keys[key])
    {
        m_keys[key] = false;
        return true;
    }
    else
    {
        return false;
    }
}

3 个答案:

答案 0 :(得分:2)

从Keyboard :: GetKey方法中删除m_keys[key] = false;。由于在第一次检查中将其设置为false,因此可以防止下一次检查看到它被按下。

答案 1 :(得分:1)

调用GetKey()将键设置为已释放 - 因为它在检查其他任何内容之前检查是否按下了键并且状态是闪屏 - 在再次检查时将始终释放该键。

改变GetKey或改变代码的编写方式。

答案 2 :(得分:0)

我最好的猜测是你的启动画面有焦点,它将接管消息循环,然后你就不会得到关键事件。只是一个猜测,如果没有看到你的启动和主窗口的窗口创建/注册代码,就无法真正知道。