У меня возникают проблемы с вводом ключа, чтобы манипулировать несколькими переменными в классе. Статическая функция 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)
Я понял один способ сделать это (но я не верю, что это лучший способ).
С функцией, все еще находящейся в 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());
Ключи работают сейчас, но единственная проблема, которую я вижу с моим решением, заключается в том, что движение не мгновенно, когда ключ сначала нажат.
У меня были аналогичные проблемы с обратными вызовами, и способ, которым я смог его решить, был не особенно изящным, однако я сделал следующее (переведенное в соответствии с вашими кодовыми именами и предполагая, что ваш код верен):
в том же файле, что и ваш основной:
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);
Надеюсь это поможет:)