首次使用SDL鼠标移动(C ++)

时间:2011-12-13 15:09:36

标签: c++ input mouse sdl

我正在为学校开发一个c ++项目,此时我的实现需要鼠标输入来控制一艘船(它应该是Tyrian的翻拍)。一切都运行正常,除了我第一次移动鼠标,它有一个偏移量取决于我开始游戏时鼠标的位置。我想这是因为我正在使用SDL_GetRelativeMouse,但我该如何阻止呢?

4 个答案:

答案 0 :(得分:0)

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

确保鼠标位于窗口范围内也可能是合适的。无论如何,它与其边界之外的应用程序无关。

答案 1 :(得分:0)

这就是我在FPS类型的应用程序中切换mousegrab所做的事情:

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()通话消耗鼠标更新是重要的部分。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我用这个:

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以抛弃第一个事件。此后在主循环调用的主事件处理函数中捕获的每个事件都是鼠标位于中心屏幕。