2010-11-24 49 views
3

J'ai un comportement étrange avec la position de la souris dans SDL. Si je redimensionne la fenêtre, les positions x, y de l'un ou l'autre des événements de la souris semblent être limitées à la largeur et à la hauteur de la fenêtre d'origine.Position de la souris SDL Recadrée après le redimensionnement

S'il y a une fonction appelez que je manque pour dire à SDL que la zone de souris a augmenté de taille.

Les parties pertinentes de l'application:

void Resize(int width, int height) 
{ 
    WindowWidth = width; 
    WindowHeight = height; 
    /* update OpenGL */ 
} 

void Init() 
{ 
    glClearColor(0.f, 0.f, 0.f, 1.f); 
    Resize(WindowWidth, WindowHeight); 
} 

void MouseClick(int button, int state, int x, int y) 
{ 
    unsigned int MouseButton = unsigned(Mouse.z); 
    unsigned int b = (1 << (button-1)); 
    if (state) 
     MouseButton = MouseButton | b; 
    else 
     MouseButton = MouseButton & (~b); 
    Mouse.z = MouseButton; 
    Mouse.x = x; 
    Mouse.y = y; 
} 

void MouseMove(int x, int y) 
{ 
    MouseRel.x = x - Mouse.x; 
    MouseRel.y = y - Mouse.y; 
    Mouse.x = x; 
    Mouse.y = y; 
} 

int main(int agrc, char *argv[]) 
{ 
    bool quit = false; 
    SDL_Event event; 

    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
     return 1; 

    if (SDL_SetVideoMode(WindowWidth, WindowHeight, 0, SDL_OPENGL | SDL_RESIZABLE) == NULL) 
     return 2; 

    Init(); 

    while (!quit) 
    { 
     DrawScene(); 
     while (SDL_PollEvent(&event)) 
     { 
      if (event.type == SDL_VIDEORESIZE) 
      { 
       Resize(event.resize.w, event.resize.h); 
      } 
      else if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP) 
      { 
       MouseClick(event.button.button, event.button.state, event.button.x, WindowHeight - event.button.y); 
       printf("event.button (%i, %i)\n", event.button.x, event.button.y); 
       MouseHandler(); 
      } 
      else if (event.type == SDL_MOUSEMOTION) 
      { 
       MouseMove(event.motion.x, WindowHeight - event.motion.y); 
       printf("event.motion (%i, %i)\n", event.motion.x, event.motion.y); 
       MouseHandler(); 
      } 
      else if (event.type == SDL_QUIT) 
       quit |= true; 
     } 
     quit |= KeyboardHandler(); 
     SDL_Delay(10); 
    } 
    SDL_Quit(); 
    return 0; 
} 
+0

OS? Version SDL? – genpfault

+0

Où est votre appel [SDL_VIDEORESIZE-déclenché 'SDL_SetVideoMode()'] (http://www.libsdl.org/cgi/docwiki.cgi/SDL_ResizeEvent)? – genpfault

+2

Windows XP et SDL Version 1.2.13. Juste semble un peu étrange que tout fonctionne à la position de la souris, SDL_SetVideoMode() est vraiment nécessaire, car il réinitialise le contexte OpenGL. Dans mes prototypes, ce n'est pas un gros problème, mais plus tard, cela signifiera recharger tous les objets OpenGL. – thing2k

Répondre

0

Essayez re-appel SDL_SetVideoMode() dans votre gestionnaire SDL_VIDEORESIZE.

+1

J'ai regardé la source de SDL sur http://hg.libsdl.org/SDL, et je peux voir où il est coupé. SDL_mouse.c lignes 135-146, il descend jusqu'à la largeur et la hauteur SDL_VideoSurface. Qui ne sont définis que par un appel à SDL_SetVideoMode. Cela aurait fonctionné si la taille SDL_VideoSurface était mise à jour dans SDL_PrivateResize (SDL_resize.c). – thing2k