Я писал утилиту для работы в качестве оболочки для ввода ключа GLFW.
Я хотел иметь набор функций, которые позволили бы мне легко передавать код клавиши и функцию, которую я хотел запускать при нажатии или отпускании клавиши.
Я думаю, что здесь все правильно, но я пытаюсь использовать его в своем классе Game и получаю следующую ошибку:
game.cpp (27): ошибка C2664: 'void KeyManager :: press (int, void *)': невозможно преобразовать аргумент 2 из 'void (__thiscall Game :: *) (void)' в 'void *' 1> Там нет контекста, в котором это преобразование возможно
Game.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);
KeyManager.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;
}
}
}