【问题标题】:Using glut to prevent the mouse from leaving the window使用 glut 防止鼠标离开窗口
【发布时间】:2018-11-11 00:53:27
【问题描述】:

我现在正在使用 glut 进行游戏,我正试图将鼠标保持在窗口内。这不是第一人称射击游戏,因此将其锁定在中心是不好的。我已经知道glutWarpPointer(int, int); 并且我正在尝试一些可行的方法(有点)。

我试过让鼠标在离开时回到窗口最近的边缘,这可行,但是有那么一瞬间你会看到鼠标在窗口外并传送回来。我不希望那样,我希望它看起来就像鼠标刚刚碰到窗口的边缘并停止向那个方向进一步移动,同时保持在任何其他可用方向上的移动。正如你所期望的那样。

【问题讨论】:

  • @KillianDS,它不是重复的,因为另一个解决方案是扭曲到屏幕中间。虽然这不是 FPS,但你不能那样做。
  • @KillianDS 不,那是为了一个fps游戏,所以他们想把鼠标锁定在中间,我想把鼠标放在窗口里,防止它离开。
  • 这对用户来说太敌对了。如果这很重要,请全屏运行。
  • 您如何/何时检查指针是否离开了您的窗口?
  • @HansPassant,哈哈是的,我可以想象用户大喊“把我的鼠标还给你#@$ @#!$ !#@$”

标签: c++ glut


【解决方案1】:

这不完全是您问题的答案,但它是您问题的答案!

几乎每个游戏都有自己的光标。他们会隐藏鼠标,并手动将光标绘制在鼠标应该放置的位置。

如果您得到自己的光标图像并按照我说的做,您可以简单地在屏幕边缘绘制光标,即使鼠标位置读数超出边界。然后你就可以把鼠标变回原位了。

【讨论】:

  • 我还没有尝试添加自己的光标(或实际上),所以我想知道,即使自定义光标,真正的鼠标在离开窗口时是否会显示一秒钟,如果是这样,我该如何解决?除此之外,这可能是我要做的,谢谢,一旦计时器到了我会接受:)。
  • 我其实不知道。就像您问题中的 cmets 一样,将鼠标困在窗口应用程序中对用户来说有点吓人,但我相信如果您用 GLUT 隐藏鼠标,如果它走出窗口,它将保持隐藏状态(这更可怕)(只是不要忘记取消隐藏它)无论如何,最好的答案是在您的程序中添加隐藏/显示,看看会发生什么。
  • 旁注,如果您有时间,请查看 [SDL](www.libsdl.org/)。在我看来,它比 GLUT 要好得多。
  • 啊,是的,我确实喜欢 SDL,但这次我要尝试一些新的东西。我喜欢 SDL 的一些东西,也喜欢 glut 的一些东西。所以我喜欢在两者之间切换。
【解决方案2】:

试图搜索并解决这个问题,但找不到答案,所以我自己实现了它。这是适用于我的第一人称相机包的方法:

来自glutPassiveMotion的回调

代码示例

void Game::passiveMouseMotion(int x, int y)
{

    //of my code for doing the cam, yours is may be different, this is based on the example from https://learnopengl.com/Getting-started/Camera
    if (firstMouse) {
    lastX = x;
    lastY = y;
    firstMouse = false;
    }

    float xoffset = x - lastX;
    float yoffset = lastY - y; // reversed since y-coordinates go from bottom to top

    lastX = x;
    lastY = y;

    camera->ProcessMouseMovement(xoffset, yoffset);

    glutPostRedisplay();

  //this is the main thing that keeps it from leaving the screen
    if ( x < 100 || x > win_w - 100 ) {  //you can use values other than 100 for the screen edges if you like, kind of seems to depend on your mouse sensitivity for what ends up working best
        lastX = win_w/2;   //centers the last known position, this way there isn't an odd jump with your cam as it resets
        lastY = win_h/2;   
        glutWarpPointer(win_w/2, win_h/2);  //centers the cursor
    } else if (y < 100 || y > win_h - 100) {
        lastX = win_w/2;
        lastY = win_h/2;
        glutWarpPointer(win_w/2, win_h/2);
    } 
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多