Первое движение мыши неожиданно с использованием SDL (C ++) - PullRequest
1 голос
/ 13 декабря 2011

Я работаю над проектом c ++ для школы, и моя реализация в данный момент требует ввода мышью для управления кораблем (предполагается, что это римейк Тириана). Все работает нормально, за исключением того, что я впервые перемещаю мышь, у нее есть смещение в зависимости от того, где была мышь, когда я запускал игру. Я думаю, это потому, что я использую SDL_GetRelativeMouse, но как я могу предотвратить это?

Ответы [ 4 ]

0 голосов
/ 08 мая 2012

Я использую это:

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, чтобы выбросить первое событие. Каждое событие, захваченное в дальнейшем в функции обработки основного события, вызываемой основным циклом, осуществляется с помощью мыши в центре экрана.

0 голосов
/ 13 декабря 2011

Это то, что я делаю для переключения мыши в приложении типа 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().

0 голосов
/ 02 мая 2012

На данный момент я просто подавлю при первом обнаружении движения мыши. Это, кажется, работает, но это кажется довольно непрофессиональным подходом.

0 голосов
/ 13 декабря 2011

Возможно, вы захотите инициализировать мышь в хорошо известную позицию при запуске приложения, возможно, непосредственно перед инициализацией обратных вызовов событий.

Также может быть уместным убедиться, что мышь находится в пределах окна. В любом случае, оно не имеет отношения к приложению за его пределами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...