注册从GLFW3中的另一个类按下的键

时间:2013-11-03 08:49:25

标签: c++ input glfw

我无法获取键输入来操作类中的一些变量。下面的静态函数key_callback属于 GLFW3的最新版本/示例。我有一个基本相机坐标的渲染类,但我无法弄清楚如何连接我的凸轮和偏航 - 俯仰 - 滚动变量,以便在按下按键时进行更新。

我已经尝试将静态函数移动到我的Renderer类中,尝试将我的cam变量设置为静态,但没有任何效果。

Renderer.h

GLfloat camX, camY, camZ, yaw, pitch, roll;

main.cpp

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    switch (key)
    {
        case GLFW_KEY_ESCAPE:
            glfwSetWindowShouldClose(window, GL_TRUE); <-- Works
            break;
        case GLFW_KEY_W: camZ += 0.1f; break; <-- What I'm trying to get
        case GLFW_KEY_S: camZ -= 0.1f; break;
        case GLFW_KEY_A: camX += 0.1f; break;
        case GLFW_KEY_D: camX -= 0.1f; break;
        case GLFW_KEY_E: yaw += 0.05f; break;
        case GLFW_KEY_R: yaw -= 0.05f; break;
    }
}

int main()

GLFWwindow* window;
Renderer rend;
....
glfwSetKeyCallback(window, key_callback);
rend.Initialize();
(Main loop)

2 个答案:

答案 0 :(得分:0)

我在回调方面遇到了类似的问题,我能够解决它的方式并不是特别优雅,但我做了以下操作(翻译为匹配您的代码名称,并假设您的代码是正确的):

与您的主文件在同一文件中:

static void getKeyInput(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    key_callback(window, key, scancode, action, mods);
}

在实际的主要功能中:

glfwSetKeyCallback(window, Renderer::key_callback);

替换为:

glfwSetKeyCallback(window, getKeyInput);

希望这会有所帮助:)

答案 1 :(得分:0)

我想出了一种做法(但我不相信这是迄今为止最好的方式)。

该功能仍然在 main.cpp 中,我创建了一个单独的Camera类,以及相机的x,y,z,偏航,俯仰,滚动的基本getter和setter。

所以从那里(因为我不能在int main()之外使用我的Renderer类),我这样做了:

(includes)...
Camera cam;

static void getKeyInput(GLFWwindow* window, int key, int scancode, int action, int mods)
{ 
    GLfloat delta = 0.0f;
    switch (key)
    {
    case GLFW_KEY_ESCAPE:
        glfwSetWindowShouldClose(window, GL_TRUE);
        break;
    case GLFW_KEY_W: 
        delta = cam.getZ();
        delta += 0.1f;
        cam.setZ(delta);
        break; 
    ....

int main()
{
    GLFWwindow* window;
    Renderer rend;
    ...
    glfwSetKeyCallback(window, key_callback);

然后在主循环中我将Render函数更改为重载:

    rend.Render(cam.getX(), cam.getZ(), cam.getYaw());

键现在正常工作,但我在解决方案中看到的唯一问题是,当第一次按下键时,移动不是瞬时的。