C++ 使用glut防止鼠标离开窗口

C++ 使用glut防止鼠标离开窗口,c++,glut,C++,Glut,我现在正在使用glut进行一个游戏,我试图将鼠标放在窗口内。这不是第一人称射击,所以把它锁定在中间是不好的。我已经知道指针(int,int)我尝试了一些有用的东西(有点) 我试着让鼠标在离开窗口时扭曲回到最近的窗口边缘,这是可行的,但在一瞬间你会看到鼠标在窗口外,然后传送回来。我不想这样,我想让它看起来就像鼠标刚好碰到窗口的边缘,并停止朝那个方向进一步移动,同时保持在任何其他可用方向的移动。就像你期望它能起作用一样。这并不是对你问题的确切回答,而是对你问题的回答 几乎每个游戏都有自己的光标。他们

我现在正在使用glut进行一个游戏,我试图将鼠标放在窗口内。这不是第一人称射击,所以把它锁定在中间是不好的。我已经知道
指针(int,int)我尝试了一些有用的东西(有点)


我试着让鼠标在离开窗口时扭曲回到最近的窗口边缘,这是可行的,但在一瞬间你会看到鼠标在窗口外,然后传送回来。我不想这样,我想让它看起来就像鼠标刚好碰到窗口的边缘,并停止朝那个方向进一步移动,同时保持在任何其他可用方向的移动。就像你期望它能起作用一样。

这并不是对你问题的确切回答,而是对你问题的回答

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


如果您获得自己的光标图像并按照我所说的操作,您可以简单地在屏幕边缘绘制光标,即使鼠标位置显示超出边界。然后你可以将鼠标重新弯曲进去。

试图搜索并找出答案,但找不到答案,所以我自己实现了它。以下是我的第一人称相机的工作原理:

从<代码>中回调

代码示例

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);
    } 
}
void游戏::被动表情动作(int x,int y)
{
//在我做cam的代码中,你的可能不同,这是基于https://learnopengl.com/Getting-started/Camera
如果(第一个鼠标){
lastX=x;
lastY=y;
firstMouse=false;
}
浮点数xoffset=x-lastX;
float yoffset=lastY-y;//由于y坐标从下到上,所以是反向的
lastX=x;
lastY=y;
摄像头->处理鼠标移动(xoffset、yoffset);
再发现();
//这是阻止它离开屏幕的主要原因
如果(x<100 | | x>win_w-100){//,如果您愿意,您可以在屏幕边缘使用100以外的值,这似乎取决于您的鼠标灵敏度,以确定哪种效果最好
lastX=win_w/2;//将最后一个已知位置居中,这样在凸轮复位时不会出现奇怪的跳跃
lastY=win_h/2;
鼠标指针(win_w/2,win_h/2);//使光标居中
}否则如果(y<100 | | y>赢h-100){
lastX=win_w/2;
lastY=win_h/2;
一个指针(win_w/2,win_h/2);
} 
}

希望这有帮助

@KillianDS,它不是复制品,因为另一个的解决方案是扭曲到屏幕中间。这不是FPS,你不能这么做。@KillianDS不,那是FPS游戏,所以他们想把鼠标锁在中间,我想把鼠标放在窗口里,防止它离开。这对用户来说太不友好了。如果这很重要,请全屏运行。您是如何/何时检查指针是否离开您的窗口的?@HansPassant,哈哈是的,我可以想象用户高喊“把鼠标还给我,你”#@$@!$!#$@$”我还没有尝试添加自己的光标(或者实际上从未尝试过),所以我想知道,当鼠标离开窗口时,即使自定义光标也会出现一秒钟吗?如果是,我如何解决这个问题?除此之外,这可能就是我将要做的,谢谢,我会在计时器一到就接受:)。我真的不知道。就像你问题中的评论一样,在窗口应用程序中捕获鼠标对用户来说有点吓人,但我相信如果你用GLUT隐藏鼠标,它会一直隐藏在窗口之外(这更吓人)(只是别忘了打开它),最好的办法是在你的程序中添加一个隐藏/显示,看看会发生什么。旁注,如果你有时间,请查看[SDL](www.libsdl.org/)。在我看来,这比供过于求要好得多。啊,是的,我确实喜欢SDL,但这次我正在尝试一些新的东西。我喜欢SDL,也喜欢过剩。所以我喜欢在两者之间切换。