所以这可能是一个关于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的网站,输入指南是我学习接收输入所需的必要事项的地方,而且似乎没有其他人有这个问题,因为我搜索并搜索了任何内容。如果有人可以提供帮助,通过解释可能的问题或指导我自己找到答案的正确方向,我将非常感激!
答案 0 :(得分:1)
好吧,我想出了我的问题。我是WAAAAAAAAAAAAAAAAAAAAAAAAAAY过度复杂。所以,我的问题是关键回调只能处理一个密钥,而且完全没必要。所以,我的修复涉及删除键回调,keyCache和isDown变量,只需将isKeyDown更改为...
bool Input::isKeyDown(int key)
{
if (glfwGetKey(m_Window, key))
return true;
return false;
}
我很抱歉我表现得多么无能为力。那么,现在我知道关键回调是如何工作的!的xD