我真的被困住了:

我有 mainWindow 并且在主游戏循环中我做:

// poll for input
glfwPollEvents();

this->controls->handleInput(window, world->getPlayer());
glfwSetCursorPosCallback(window, controls->handleMouse);

我想要做的是让一个类负责控件并让这个类也处理鼠标。

我总是得到:

'Controls::handleMouse': function call missing argument list; use '&Controls::handleMouse' to create a pointer to member

现在,当我尝试这个时,我得到:

'GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow *,GLFWcursorposfun)' : cannot convert argument 2 from 'void (__thiscall Controls::* )(GLFWwindow *,double,double)' to 'GLFWcursorposfun'

不确定我在这里做错了什么,因为 GLFWcursorposfun 只是一个带有 GLFWwindow 和两个双打的 typedef。

由于该函数在另一个类中,我尝试为它创建一个原型,例如:

class Controls {
    void handleInput(GLFWwindow *window, object *gameObject);
    void handleMouse(GLFWwindow *window, double mouseXPos, double mouseYPos);
};

但无济于事。

编辑:当然,如果我将函数设为静态,我可以将其设置为 &Controls::handleMouse,但我宁愿能够使用它们操纵的不同摄像机和游戏对象创建多个控件对象。

另外,如何获得正确的相机/游戏对象数据呢?

#1楼 票数:3 已采纳

您不能将类的成员函数作为函数传递。 glfwSetCursorPosCallback它期待一个函数并抛出错误,因为它获得了一个成员函数。

换句话说,您希望提供一个全局函数并将其传递给glfwSetCursorPosCallback

如果您真的希望控件对象获得光标位置回调,您可以将 Controls 的实例存储在全局变量中并将回调传递给该实例。 像这样的东西:

static Controls* g_controls;

void mousePosWrapper( double x, double y )
{
    if ( g_controls )
    {
        g_controls->handleMouse( x, y );
    }
}

然后当您调用glfwSetCursorPosCallback您可以传递mousePosWrapper函数:

glfwSetCursorPosCallback( window, mousePosWrapper );

#2楼 票数:3

我的解决方案:不要使用回调设置器。 相反,我执行以下操作:

glfwPollEvents();

this->controls->handleInput(window, mainObj);
this->controls->handleMouse(window, mainObj);

在 handleMouse 我做:

GLdouble xPos, yPos;
glfwGetCursorPos(window, &xPos, &yPos);

#3楼 票数:1

另一种解决方案是将指向controls的指针与GLFWindow相关联。 请参阅glfwSetWindowUserPointer

可以通过glfwGetWindowUserPointerGLFWWindow对象一次检索指针。 当然,返回类型是void*并且必须转换为Controls*

可以使用Lambda 表达式代替全局函数或静态方法。 例如:

glfwSetWindowUserPointer(window, this->controls);

glfwSetCursorPosCallback( window, [](GLFWwindow *window, double x, double y)
{
    if (Controls *controls = static_cast<Controls*>(glfwGetWindowUserPointer(window)))
        controls->handleMouse(window, x, y);
} );

  ask by Sorona translate from so

未解决问题?本站智能推荐:

1回复

回调函数中的GLFW传递了更多预期的参数

我正在使用GLFW及其C ++中的回调函数。 我想在回调函数中实现的是修改类Keyboard的类型的变量。 回调函数的类型必须为void(* GLFWkeyfun) (GLFWwindow *, int, int, int, int) glfwSetKeyCallback(GLFWwi
2回复

D到C函数中的类方法回调

我在D中编写了一个简单,轻量级的引擎。对于输入调用,我使用GLFW3。 有问题的库使用回调将输入事件发送到程序。 我想要的是使用类中的方法作为回调函数,而不是函数。 事实证明这很困难(就像C ++中一样)。 我相信有一种优雅的方法可以做到这一点,但这就是我现在的方法。 这是回调设置
2回复

在GLFW3中注册从另一个类别按下的键

我在获取键输入来操纵类中的一些变量时遇到麻烦。 静态函数key_callback下面属于的最新版本/示例GLFW3 。 我有一个带有基本相机坐标的渲染类,但是我在弄清楚如何连接我的cam和偏航-俯仰-俯仰-滚动变量时遇到麻烦,当按下键时要进行更新。 我尝试将静态函数移到我的Rendere
2回复

C++在主函数中使用一个类中的成员函数?

我有我的main和im设置输入,但是我使用getters / setters也使用从InputHander到我的main的方法,但是这样做会导致堆栈溢出,因为只有无限循环正在进行。 我得到的警告: 除了使用getter和setter之外,我没有其他想法可以调用此方法 Main.cpp
1回复

如何在GLFW中为游戏引擎执行正确的输入类

我正在做一个我的小项目,我基本上创建自己的c ++游戏引擎/框架来创建图形和简单的游戏。 我使用OpenGL和GLFW。 我的目标是拥有类似于各种图形框架的东西,比如raylib或openFrameworks(但当然是剥离的) 实际上到目前为止一切正常,但我无法弄清楚如何正确地将输入与窗
1回复

将纹理从一个OpenGL库复制到另一个库有哪些选项?

语境我正在开发一个基于插件的架构,旨在允许每个插件利用自己的图形 API,只要它可以传递引擎可以使用主 OpenGL 图形上下文和着色器摄取和渲染的标准纹理格式。 理想情况下,每个插件都不会知道也无法访问引擎正在使用的主 OpenGL 图形上下文。 这意味着每个插件必须提供自己的上下文并将图形渲染为
1回复

如何通过mingw-w64在windows中运行vulkan示例代码?

每个人。 我最近开始在我的 windows 笔记本电脑上学习 vulkan sdk 编程。 我下载了 VulkanSDK-1.2.162.0、x86_64-8.1.0-release-win32-seh-rt_v6-rev0 和 glfw-3.3.2.bin.WIN64,解压并设置 windows
1回复

类中的OpenGL函数

我正在创建一个包含ParticleFactory类的OpenGL项目,以在场景中生成粒子。 为此,我创建了一个类: 我在这里的方法是先实例化一个对象,然后在主循环上调用.draw() ,但这似乎无效,我也不知道为什么。