SDL2 在 Fedora 21 中调整大小错误但在 windows 中正常
SDL2 resize buggy in Fedora 21 but fine in windows
我正在构建一个跨平台 C++ OpenGL 游戏,使用 SDL2 作为 window 管理器,我最近发现调整 window 的大小在 linux 中有一些奇怪的问题。其他 windows,例如终端,可以很好地调整大小。可能还值得注意的是,Fedora 在 VMware 虚拟机中。
在 windows 中,调整大小功能正常。
在 Fedora21 中调整大小很奇怪。我能解释的最好的是,在调整 window 的大小时:
- 当鼠标静止时总是向右侧伸出
- 尽管只调整了边的大小,但它有时会垂直调整到屏幕顶部
- 从底部向内调整大小直到鼠标静止不动,然后 window 开始以恒定速率向外拉伸(同时也向右向外拉伸)
- 仅有时 window 会在您松开鼠标时捕捉到您离开鼠标的位置。其他时候它停留在自我伸展的位置。取决于你从哪一侧伸展。
- 当 window 没有快速返回到您释放它的位置时,有时 window 会移动到正确的宽度,但位于 window 向右拉伸的位置。
我知道它可能在我的代码中,所以我在下面提供了相关代码。如果您需要查看更多,请告诉我。奇怪的是它发生在一个 OS 而不是另一个。我还在 OSX 上进行了编译,所以我也会看看那里发生了什么。
相关事件案例
case SDL_WINDOWEVENT_RESIZED:
if (event.window.windowID == SDL_GetWindowID(mainWindow))
{
SDL_SetWindowSize(mainWindow, event.window.data1, event.window.data2);
reshape(event.window.data1, event.window.data2);
postRedisplay(); // Change state to redraw
}
break;
还有我的整形代码
void reshape(int w, int h)
{
g.width = w;
g.height = h;
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
感谢您的帮助。问题是 SDL 正在处理 window 调整大小,但后来我也在手动处理它。我不知道为什么这在 windows 中不是问题,我猜它在 windows 中的处理方式不同。
解决方法:去掉下面一行
SDL_SetWindowSize(window, event.window.data1, event.window.data2);
我正在构建一个跨平台 C++ OpenGL 游戏,使用 SDL2 作为 window 管理器,我最近发现调整 window 的大小在 linux 中有一些奇怪的问题。其他 windows,例如终端,可以很好地调整大小。可能还值得注意的是,Fedora 在 VMware 虚拟机中。
在 windows 中,调整大小功能正常。
在 Fedora21 中调整大小很奇怪。我能解释的最好的是,在调整 window 的大小时:
- 当鼠标静止时总是向右侧伸出
- 尽管只调整了边的大小,但它有时会垂直调整到屏幕顶部
- 从底部向内调整大小直到鼠标静止不动,然后 window 开始以恒定速率向外拉伸(同时也向右向外拉伸)
- 仅有时 window 会在您松开鼠标时捕捉到您离开鼠标的位置。其他时候它停留在自我伸展的位置。取决于你从哪一侧伸展。
- 当 window 没有快速返回到您释放它的位置时,有时 window 会移动到正确的宽度,但位于 window 向右拉伸的位置。
我知道它可能在我的代码中,所以我在下面提供了相关代码。如果您需要查看更多,请告诉我。奇怪的是它发生在一个 OS 而不是另一个。我还在 OSX 上进行了编译,所以我也会看看那里发生了什么。
相关事件案例
case SDL_WINDOWEVENT_RESIZED:
if (event.window.windowID == SDL_GetWindowID(mainWindow))
{
SDL_SetWindowSize(mainWindow, event.window.data1, event.window.data2);
reshape(event.window.data1, event.window.data2);
postRedisplay(); // Change state to redraw
}
break;
还有我的整形代码
void reshape(int w, int h)
{
g.width = w;
g.height = h;
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
感谢您的帮助。问题是 SDL 正在处理 window 调整大小,但后来我也在手动处理它。我不知道为什么这在 windows 中不是问题,我猜它在 windows 中的处理方式不同。
解决方法:去掉下面一行
SDL_SetWindowSize(window, event.window.data1, event.window.data2);