第一次鼠标移动意外使用SDL (c++)

First mouse movement unexpected using SDL (C++)

本文关键字:SDL c++ 鼠标 移动 意外 第一次      更新时间:2023-10-16

我正在为学校做一个c++项目,我现在的实现需要鼠标输入来控制一艘船(这应该是Tyrian的重制)。一切都很正常,除了我第一次移动鼠标时,它有一个偏移量,这取决于我开始游戏时鼠标的位置。我猜这是因为我用的是SDL_GetRelativeMouse,但我怎么预防呢?

您可能希望在应用程序开始时将鼠标初始化到一个已知的位置,可能就在初始化事件回调之前。

确保鼠标在窗口范围内也是合适的。无论如何,它与应用程序边界之外的应用程序并不相关。

下面是我在fps类型的应用程序中切换鼠标抓取的操作:

if(event.key.keysym.sym == SDLK_z)
{
    if( mouse_grabbed ) 
    {
        SDL_WM_GrabInput(SDL_GRAB_OFF);
        SDL_WarpMouse( display->w/2, display->h/2 );
        SDL_ShowCursor(1);
    } 
    else 
    {
        SDL_ShowCursor(0);
        SDL_WM_GrabInput(SDL_GRAB_ON);
        int tx,ty;
        SDL_GetRelativeMouseState(&tx, &ty);
    }
    mouse_grabbed = !mouse_grabbed;
}

通过虚拟SDL_GetRelativeMouseState()调用消费鼠标更新是重要的部分。

目前我将只抑制第一次鼠标移动被检测到。这似乎是有效的,但这似乎是一个相当不专业的方法。

我用这个:

Sdl.SDL_ShowCursor(Sdl.SDL_DISABLE);
Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_ON);
e=new Sdl.SDL_Event();
pollOne();
.
.
.
private void pollOne(){
while(Sdl.SDL_PollEvent(out e)==1){
switch(e.type){ 
case Sdl.SDL_MOUSEMOTION:
float throwAway=((float)e.motion.xrel*headSens);    
break;
}
}
}

基本上,当初始化鼠标(抓住鼠标并使其不可见)时,调用pollOne来丢弃第一个事件。以后在主循环调用的主事件处理函数中捕获的每个事件都是鼠标位于屏幕中央。