Зарегистрировать клавиши, нажатые из другого класса в GLFW3

0

У меня возникают проблемы с вводом ключа, чтобы манипулировать несколькими переменными в классе. Статическая функция key_callback ниже относится к последней версии/примеру GLFW3. У меня есть класс рендеринга с базовыми координатами камеры, но мне трудно понять, как подключить переменные кулачка и рыскания, чтобы обновляться при нажатии клавиш.

Я попытался переместить статическую функцию в класс Renderer, попытался сделать мои кулачковые переменные статичными, но ничего не получилось.

В пределах 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)
Теги:
input
glfw

2 ответа

0

Я понял один способ сделать это (но я не верю, что это лучший способ).

С функцией, все еще находящейся в main.cpp, я сделал отдельный класс камеры вместе с базовыми геттерами и сеттерами для камеры x, y, z, yaw, pitch, roll.

Итак, оттуда (поскольку я не могу использовать класс Renderer вне int main()), я сделал следующее:

(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());

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

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);

Надеюсь это поможет:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню