GLFW переключающий логический тумблер - PullRequest
0 голосов
/ 25 сентября 2018

Я использую GLFW для ввода с клавиатуры, но обработка происходит слишком быстро, поэтому мой логический переключатель при однократном нажатии меняется примерно 10 раз, так как ввод обрабатывается каждый кадр.Все что мне нужно, чтобы за одно нажатие клавиши пробела это изменило бы состояние.Мой текущий код ниже:

if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
    show = !show;
}

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я рекомендую использовать GLFWs обратные вызовы клавиш вместо того, чтобы каждый раз указывать состояние ключа.Таким образом, вы получите только одно нажатие клавиши и одно событие освобождения клавиши для каждой клавиши.

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if(action == GLFW_RELEASE) return; //only handle press events
    if(key == GLFW_KEY_SPACE) show = !show;
}

//in main or init
glfwSetKeyCallback(window, key_callback);
0 голосов
/ 25 сентября 2018

Да.glfwGetKey предназначен для непрерывного клавишного ввода. Руководство GLFW перечисляет glfwSetKeyCallback в качестве лучшей альтернативы, если вы хотите одноразовое уведомление о нажатии клавиши.

Таким образом, для вашего случая это будет что-то вроде этого:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_SPACE && action == GLFW_PRESS)
        show = !show;
}

Если вы не хотите использовать этот метод по какой-либо причине, вы всегда можете реализовать подобное самостоятельно.Вам понадобится логическое значение (или массив значений), представляющее состояние ключа.Затем при обработке ввода вы должны реагировать только на изменение состояния кнопки, например:

bool spacePressed;

// in handling
bool spaceCurrentlyPressed = glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS;

if (!spacePressed && spaceCurrentlyPressed) { // wasn't before, is now
    show = !show;
}
spacePressed = spaceCurrentlyPressed;
...