我一直在编写一个实用程序来作为 GLFW 键输入的包装器。
我想要一组函数,使我能够轻松地传递键代码和我希望在按下或释放键时触发的函数。
我认为这里的一切都是正确的,但我试图在我的 Game 类中使用它并且我收到以下错误:
game.cpp(27): error C2664: 'void KeyManager::press(int,void *)' : 无法将参数 2 从 'void (__thiscall Game::* )(void)' 转换为 'void *' 1> 那里没有可以进行这种转换的上下文
游戏.cpp:
void Game::testKey()
{
std::cout << "Key Up Pressed" << std::endl;
}
void Game::init()
{
// KEY MANAGER:
KeyManager::initialize();
KeyManager::press(GLFW_KEY_UP, &Game::testKey);
密钥管理器.cpp:
#include <map>
#include <vector>
#include "global.h"
#include "key_manager.h"
namespace KeyManager
{
std::map<int, int> keyAction;
std::map<int, std::vector<void(*)()>> pressFunctions;
std::map<int, std::vector<void(*)()>> releaseFunctions;
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
keyAction[key] = action;
if (keyAction[key] == GLFW_PRESS)
{
for (int i = 0; i != pressFunctions[key].size(); ++i)
{
(*pressFunctions[key].at(i))();
}
}
if (keyAction[key] == GLFW_RELEASE)
{
for (int i = 0; i != releaseFunctions[key].size(); ++i)
{
(*releaseFunctions[key].at(i))();
}
}
}
void initialize()
{
glfwSetKeyCallback(window, key_callback);
}
void press(int keyCode, void(*listener)())
{
pressFunctions[keyCode].push_back(listener);
}
void release(int keyCode, void(*listener)())
{
releaseFunctions[keyCode].push_back(listener);
}
bool held(int keyCode)
{
if (keyAction[keyCode] == GLFW_PRESS || keyAction[keyCode] == GLFW_REPEAT)
{
return true;
} else {
return false;
}
}
}