GLFW输入处理无法按预期工作

时间:2016-07-06 03:19:03

标签: c++ input glfw

所以这可能是一个关于GLFW的新手问题,但我似乎有一个有趣的问题。因此,我正在使用GLFW开发一个简单的输入处理类,特别是使用静态方法只允许包含头文件来使用这些方法。所以这是我的代码到目前为止......

InputHandler.cpp

#include "InputHandler.h"

GLFWwindow *Input::m_Window;
bool Input::isDown;
std::vector<int> Input::keyCache;

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    for (int _key = 0; _key < Input::keyCache.size(); _key++)
    {
        if (key == Input::keyCache[_key] && action == GLFW_PRESS || key == Input::keyCache[_key] && action == GLFW_REPEAT)
            Input::isDown = true;
        else
            Input::isDown = false;
    }
}

void Input::processInput(GLFWwindow* window)
{
    m_Window = window;
}

bool Input::isKeyDown(int key)
{
    keyCache.push_back(key);
    glfwSetKeyCallback(m_Window, key_callback);
    return isDown;
}

InputHandler.h

#pragma once

#include <GLFW\glfw3.h>
#include <vector>

class Input
{
public:
    static bool isDown;
    static std::vector<int> keyCache;
private:
    static GLFWwindow *m_Window;

public:
    static void processInput(GLFWwindow* window);
    static bool isKeyDown(int key);
    static bool isKeyUp(int key);
    static int getMouseX();
    static int getMouseY();
};

但是,每当我调用isKeyDown方法时,如果键是否关闭,它将返回true或false多次,程序似乎只响应上面提到的最后一个键。例如,如果我使用代码...

if (Input::isKeyDown(GLFW_KEY_W) || Input::isKeyDown(GLFW_KEY_Q))
        std::cout << "Key is down" << std::endl;

只有Q键会触发语句,W什么都不做。我已多次浏览GLFW的网站,输入指南是我学习接收输入所需的必要事项的地方,而且似乎没有其他人有这个问题,因为我搜索并搜索了任何内容。如果有人可以提供帮助,通过解释可能的问题或指导我自己找到答案的正确方向,我将非常感激!

1 个答案:

答案 0 :(得分:1)

好吧,我想出了我的问题。我是WAAAAAAAAAAAAAAAAAAAAAAAAAAY过度复杂。所以,我的问题是关键回调只能处理一个密钥,而且完全没必要。所以,我的修复涉及删除键回调,keyCache和isDown变量,只需将isKeyDown更改为...

bool Input::isKeyDown(int key)
{
    if (glfwGetKey(m_Window, key))
        return true;

    return false;
}

我很抱歉我表现得多么无能为力。那么,现在我知道关键回调是如何工作的!的xD