繁体   English   中英

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

[英]Why isn't my game pausing? (Windows C++ Keyboard Input Statemachine)

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

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

游戏正常运行,在暂停和播放之间切换,但是当我尝试添加启动屏幕以开始游戏时,暂停功能停止运行,我不确定为什么...

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()将指定的键设置为向下(true)或向上(false)

哦,所有的splashScreen()pauseScreen()和gamePlay()确实都是代表每个状态的显示精灵(此刻)

设定键

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;
    }
}

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

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

更改GetKey或更改代码编写方式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM