SDL鼠标位置在调整大小后被裁剪

3

我在SDL中遇到了一些奇怪的鼠标位置行为。如果我将窗口调整得更大,无论是鼠标事件的x、y位置,似乎都受限于原始窗口的宽度和高度。

是否有一些函数调用我错过了,告诉SDL鼠标区域的大小已经增加。

应用程序的相关部分:

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;
}

你的 SDL_VIDEORESIZE 触发的 SDL_SetVideoMode() 调用在哪里? - genpfault
2
Windows XP和SDL版本1.2.13。只是感觉有点奇怪,因为除了鼠标位置之外,一切都正常工作。SDL_SetVideoMode()真的必要吗?因为它会重置OpenGL上下文。在我的原型中,这不是一个大问题,但在更深入的开发中,这将意味着重新加载所有的OpenGL对象。 - thing2k
1
@genpfault 刚刚测试了一下,调用 SDL_SetVideoMode() 确实解决了鼠标问题。如果将你的评论转换成答案,我会接受它。 - thing2k
1个回答

0

1
我已经查看了http://hg.libsdl.org/SDL上SDL源代码,并且可以看到它被裁剪的地方。SDL_mouse.c第135-146行,它将缩小到SDL_VideoSurface的宽度和高度。这些值只能通过调用SDL_SetVideoMode来设置。如果在SDL_PrivateResize(SDL_resize.c)中更新了SDL_VideoSurface的大小,则应该可以工作。 - thing2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接