Почему моя игра не останавливается? (Состояние ввода с клавиатуры Windows C ++) - PullRequest
0 голосов
/ 13 января 2011

Я пишу игру на C ++ с использованием Windows API, у которого есть заставка в начале, до начала игры, и которую можно приостановить.

Я сохраняю состояние игры в enum, 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 () устанавливает указанный ключ как вниз (true) или вверх (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 ]

2 голосов
/ 13 января 2011

Удалить m_keys[key] = false; из метода Keyboard :: GetKey.Поскольку при первой проверке он устанавливается в значение false, он не позволяет следующей проверке увидеть, что она была нажата.

1 голос
/ 13 января 2011

Вызов GetKey () устанавливает ключ как отпущенный - так как он проверяет, нажата ли клавиша и находится ли экран-заставка перед проверкой чего-либо еще - ключ всегда будет отпущен при повторной проверке.

Измените GetKey или измените способ написания кода.

0 голосов
/ 13 января 2011

Мое лучшее предположение состоит в том, что ваш заставка имеет фокус, и он перехватит цикл сообщений, тогда вы не получите ключевое событие.Просто догадка, не могу знать, не видя код создания / регистрации окна вашего всплеска и главных окон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...