2010-11-24 16 views
3

SDLのマウスの位置に何らかの異常な動作が発生しています。ウィンドウのサイズを変更すると、いずれのマウスイベントのx、yポジションも元のウィンドウの幅と高さに制限されているようです。SDLマウスの位置がリサイズ後に切り取られます

私はSDLにマウス領域のサイズが大きくなったことを伝えるためにいくつかの関数呼び出しがあるとします。アプリの

関連パーツ:あなたのSDL_VIDEORESIZEハンドラ内

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? SDLバージョン? – genpfault

+0

あなたの[SDL_VIDEORESIZE-triggered 'SDL_SetVideoMode()'](http://www.libsdl.org/cgi/docwiki.cgi/SDL_ResizeEvent)コールはどこにありますか? – genpfault

+2

Windows XPおよびSDLバージョン1.2.13。 OpenGLコンテキストをリセットするので、SDL_SetVideoMode()が本当に必要です。私のプロトタイプでは大きな問題ではありませんが、もっと下に行くと、すべてのOpenGLオブジェクトをリロードすることになります。 – thing2k

答えて

0

試し再呼び出しSDL_SetVideoMode()

+1

http://hg.libsdl.org/SDLのSDLのソースを見て、クリップされている場所を確認できます。 SDL_mouse.c行は135〜146行で、SDL_VideoSurfaceの幅と高さに切り落とします。 SDL_SetVideoModeの呼び出しによってのみ設定されます。 SDL_PrivateResize(SDL_resize.c)でSDL_VideoSurfaceのサイズが更新された場合は正常に動作していました。 – thing2k

関連する問題