捕捉老鼠?

发布于 2024-09-18 02:11:26 字数 112 浏览 4 评论 0原文

我正在使用 GLUT 并开发 FPS 游戏。我需要一种方法来捕获鼠标,以便相机继续移动,因为现在当鼠标位置超过显示器限制时,无法计算 X 的变化或 Y 的变化。我怎样才能“捕获”鼠标过剩?

谢谢

I'm using GLUT and developing a FPS game. I need a way to trap the mouse so that the camera continues to move because right now when the mouse position exceeds the monitor limit, there is no way to calculate change in X or change in Y. How can I 'trap' the mouse with GLUT?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

愿与i 2024-09-25 02:11:26

我建议使用现成的引擎,例如 OGRE 3D,但如果你真的想重新发明轮子,方法如下...

在我所知的所有情况下,PC FPS 游戏都会通过注册鼠标运动回调来“捕获”指针,记录相对运动,然后将指针扭曲回窗口中心。

下面是我在一两年前编写的一些代码,用于将鼠标输入添加到 OpenGL with C++ 课程中的示例乒乓球桌中:

void resetPointer() {
    glutWarpPointer(TABLE_X/2, TABLE_Y/2);
    lastMousePos = TABLE_Y/2;
}

void mouseFunc(int sx, int sy) {
    if (!started) { return; }
    int vertMotion = lastMousePos - sy;
    lastMousePos = sy;
    player1.move(vertMotion);

    // Keep the pointer from leaving the window.
    if (fabs(TABLE_X/2 - sx) > 25 || fabs(TABLE_Y/2 - sy) > 25) {
        resetPointer();
    }
}

// This goes in with your "start new game" code if you want a menu
resetPointer();
glutSetCursor(GLUT_CURSOR_NONE);
glutPassiveMotionFunc(mouseFunc);

它仅跟踪垂直运动,但添加水平运动是微不足道的。

I'd recommend using a ready-made engine like OGRE 3D instead, but if you really want to reinvent the wheel, here's how...

In all cases I'm aware of, PC FPS games "trap" the pointer by registering a mouse motion callback, noting the relative motion, and then warping the pointer back to the center of the window.

Here's some code I wrote to add mouse input to a sample ping-pong table in an OpenGL with C++ course a year or two ago:

void resetPointer() {
    glutWarpPointer(TABLE_X/2, TABLE_Y/2);
    lastMousePos = TABLE_Y/2;
}

void mouseFunc(int sx, int sy) {
    if (!started) { return; }
    int vertMotion = lastMousePos - sy;
    lastMousePos = sy;
    player1.move(vertMotion);

    // Keep the pointer from leaving the window.
    if (fabs(TABLE_X/2 - sx) > 25 || fabs(TABLE_Y/2 - sy) > 25) {
        resetPointer();
    }
}

// This goes in with your "start new game" code if you want a menu
resetPointer();
glutSetCursor(GLUT_CURSOR_NONE);
glutPassiveMotionFunc(mouseFunc);

It only tracks vertical motion, but adding horizontal is trivial.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文