我正在尝试使用glfwSetKeyCallback功能创建基本相机运动。问题在于它无法处理同时输入多个按键,例如W和A应该以左上方向对角线方式移动。相反,它表现得好像只知道最后一个输入的按键一样。所以假设我按下A向左移动,它就向左移动,然后我按下W向左上方对角线移动,它就“忘记”了A被按下并向上移动。
float cameraSpeed = 0.02f;
if (key == GLFW_KEY_ESCAPE && (action == GLFW_PRESS || action == GLFW_REPEAT))
glfwSetWindowShouldClose(window, GLFW_TRUE);
if (key == GLFW_KEY_W && (action == GLFW_PRESS || action == GLFW_REPEAT))
Game::GetInstance()->cameraY += cameraSpeed;
if (key == GLFW_KEY_A && (action == GLFW_PRESS || action == GLFW_REPEAT))
Game::GetInstance()->cameraX -= cameraSpeed;
if (key == GLFW_KEY_S && (action == GLFW_PRESS || action == GLFW_REPEAT))
Game::GetInstance()->cameraY -= cameraSpeed;
if (key == GLFW_KEY_D && (action == GLFW_PRESS || action == GLFW_REPEAT))
Game::GetInstance()->cameraX += cameraSpeed;
我想到的一个解决方案是创建自己的布尔型键盘输入表,并仅使用GLFW函数设置它们,例如:
if (key == GLFW_KEY_A && action == GLFW_PRESS)
// set 'A' to true;
if (key == GLFW_KEY_A && action == GLFW_RELEASE)
// set 'A' to false;
然后我想在完全不同的函数/类/其他中对其进行操作。但这对我来说似乎不太干净。有什么好的解决方法吗?
GLFW_PRESS
和GLFW_RELEASE
时有什么具体的困难吗? - user7860670GLFW_RELEASE
吗? - user7860670GLFW_REPEAT
。这没有任何问题。实际上根本不需要处理GLFW_REPEAT
。您可以处理GLFW_PRESS
和GLFW_RELEASE
,并将相机位置调整为与当前按下的键对应的方向。请注意,您不应等待键事件来更新相机位置,就像您现在所做的那样。 - user7860670