I've been writing a utility to work as a wrapper for GLFW Key Input.
I wanted to have a set of functions that would enable me to easily pass the key code and the function I wanted to be triggered upon the key being pressed or released.
I think everything here is right but I'm attempting to use it in my Game class and I'm getting the following error:
game.cpp(27): error C2664: 'void KeyManager::press(int,void *)' : cannot convert argument 2 from 'void (__thiscall Game::* )(void)' to 'void *' 1> There is no context in which this conversion is possible
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;
}
}
}