C++ SDL\u VIDEORESIZE事件中的奇怪高度值
我正在尝试使用SDL创建一个应用程序,并希望调整窗口的大小 现在,如果我尝试最大化窗口,它会工作,如果我把它放在屏幕的左半部分或右半部分,它会工作,并采取正确的大小。 但是,当我通过拖动窗口的一侧(垂直或水平)来调整窗口的大小时,发生了一件非常奇怪的事情:高度一直增长,直到它等于屏幕的高度 当它增长时,我可以看到它不是瞬间的,事实上它需要很多次,每次增长37像素。 这真的很奇怪,我真的不知道该怎么办 我创建了一个极简主义代码来测试问题是否是由于代码中的某些特殊内容造成的,但它没有改变任何东西,问题仍然是一样的 以下是我的极简主义代码:C++ SDL\u VIDEORESIZE事件中的奇怪高度值,c++,linux,ubuntu,sdl,gnome,C++,Linux,Ubuntu,Sdl,Gnome,我正在尝试使用SDL创建一个应用程序,并希望调整窗口的大小 现在,如果我尝试最大化窗口,它会工作,如果我把它放在屏幕的左半部分或右半部分,它会工作,并采取正确的大小。 但是,当我通过拖动窗口的一侧(垂直或水平)来调整窗口的大小时,发生了一件非常奇怪的事情:高度一直增长,直到它等于屏幕的高度 当它增长时,我可以看到它不是瞬间的,事实上它需要很多次,每次增长37像素。 这真的很奇怪,我真的不知道该怎么办 我创建了一个极简主义代码来测试问题是否是由于代码中的某些特殊内容造成的,但它没有改变任何东西,问
#include <SDL/SDL.h>
using namespace std;
int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface* surface=SDL_SetVideoMode(100, 100, 32, SDL_HWSURFACE|SDL_RESIZABLE);
SDL_Event event;
while (true)
{
SDL_Flip(surface);
SDL_PollEvent(&event);
if (event.type==SDL_QUIT) break;
else if (event.type==SDL_VIDEORESIZE)
{
surface=SDL_SetVideoMode(event.resize.w, event.resize.h, 32, SDL_HWSURFACE|SDL_RESIZABLE);
}
SDL_Delay(30);
}
}
#包括
使用名称空间std;
int main()
{
SDL_Init(SDL_Init_视频);
SDL_表面*表面=SDL_设置视频模式(100,100,32,SDL_表面| SDL_可调整大小);
SDL_事件;
while(true)
{
SDL_翻转(表面);
SDL_PollEvent(事件和事件);
如果(event.type==SDL_QUIT)中断;
else if(event.type==SDL\u VIDEORESIZE)
{
surface=SDL_SetVideoMode(event.resize.w,event.resize.h,32,SDL_hwssurface | SDL_resizeable);
}
SDL_延迟(30);
}
}
所以问题似乎不在我的代码中。(为了验证这一点,我安装了一个使用SDL(Briqoolo)的游戏,它也有同样的问题)
我在网上搜索过,但似乎我是唯一一个遇到这个问题的人(或者可能是我没有使用好的关键字),所以似乎不是SDL
问题可能是由我的系统引起的。
有关信息,请参阅带有Gnome桌面的Ubuntu 16.10 64位
如何解决这个问题而不产生副作用?终于找到了一种避免这种情况的方法(但我真的不明白为什么第一种方法不起作用): 如果我存储新的大小,处理所有事件,然后调整大小,它就会工作。以下是工作代码:
#include <SDL/SDL.h>
#include <iostream>
using namespace std;
int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface* surface=SDL_SetVideoMode(100, 100, 32, SDL_HWSURFACE|SDL_RESIZABLE);
SDL_Event event;
bool resized=false;
int newW, newH;
while (true)
{
while (SDL_PollEvent(&event))
{
if (event.type==SDL_QUIT) return 0;
else if (event.type==SDL_VIDEORESIZE)
{
resized=true;
newW=event.resize.w;
newH=event.resize.h;
}
}
}
if (resized)
{
resized=false;
surface=SDL_SetVideoMode(newW, newH, 32, SDL_HWSURFACE|SDL_RESIZABLE);
}
SDL_Flip(surface);
}
#包括
#包括
使用名称空间std;
int main()
{
SDL_Init(SDL_Init_视频);
SDL_表面*表面=SDL_设置视频模式(100,100,32,SDL_表面| SDL_可调整大小);
SDL_事件;
bool resized=false;
int newW,newH;
while(true)
{
while(SDL_事件和事件))
{
if(event.type==SDL_QUIT)返回0;
else if(event.type==SDL\u VIDEORESIZE)
{
调整大小=真;
newW=event.resize.w;
newH=event.resize.h;
}
}
}
如果(调整大小)
{
调整大小=假;
表面=SDL_设置视频模式(新,新,32,SDL_表面| SDL_可调整大小);
}
SDL_翻转(表面);
}
终于找到了避免这种情况的方法(但我真的不明白为什么第一种方法不起作用):
如果我存储新的大小,处理所有事件,然后调整大小,它就会工作。以下是工作代码:
#include <SDL/SDL.h>
#include <iostream>
using namespace std;
int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface* surface=SDL_SetVideoMode(100, 100, 32, SDL_HWSURFACE|SDL_RESIZABLE);
SDL_Event event;
bool resized=false;
int newW, newH;
while (true)
{
while (SDL_PollEvent(&event))
{
if (event.type==SDL_QUIT) return 0;
else if (event.type==SDL_VIDEORESIZE)
{
resized=true;
newW=event.resize.w;
newH=event.resize.h;
}
}
}
if (resized)
{
resized=false;
surface=SDL_SetVideoMode(newW, newH, 32, SDL_HWSURFACE|SDL_RESIZABLE);
}
SDL_Flip(surface);
}
#包括
#包括
使用名称空间std;
int main()
{
SDL_Init(SDL_Init_视频);
SDL_表面*表面=SDL_设置视频模式(100,100,32,SDL_表面| SDL_可调整大小);
SDL_事件;
bool resized=false;
int newW,newH;
while(true)
{
while(SDL_事件和事件))
{
if(event.type==SDL_QUIT)返回0;
else if(event.type==SDL\u VIDEORESIZE)
{
调整大小=真;
newW=event.resize.w;
newH=event.resize.h;
}
}
}
如果(调整大小)
{
调整大小=假;
表面=SDL_设置视频模式(新,新,32,SDL_表面| SDL_可调整大小);
}
SDL_翻转(表面);
}
请不要对您的问题进行使现有答案无效的编辑。我只是认为最好有一个工作得更好的代码,这样就可以清楚地知道错误不是来自此(或来自某个特定部分)无法重现(第一次编辑的代码-第二次编辑的代码有自由曲面,这显然是错误的),我也不真正理解这个问题。你能更好地描述它,并用不同的窗口管理器检查它吗?以前的非合成窗口管理器?@keltar为什么自由曲面会出错?“检查不同的窗口管理器”是什么意思?@dido22,因为它说“返回的曲面由SDL_Quit释放,而不能由调用者释放。此规则还包括对SDL_SetVideoMode的连续调用”。至于WM,您的gnome会话可能使用合成WM;有几种非合成的,如openbox
。搜索有关您的桌面环境和发行版的文章。请不要对您的问题进行使现有答案无效的编辑。我只是想,最好有一个工作得更好的代码,这样就可以清楚地知道错误不是来自此(或来自某个特定部分)而无法复制(对于first edit的代码-第二个有自由曲面,这显然是错误的),我也没有真正理解这个问题。你能更好地描述它,并用不同的窗口管理器检查它吗?Prevable non compositing one?@keltar为什么自由曲面会错?你说“检查不同的窗口管理器”是什么意思?@dido22因为“返回的曲面由SDL_Quit释放,调用者不能释放。此规则还包括对SDL_SetVideoMode的连续调用”。至于WM,您的gnome会话可能使用合成WM;有几种非合成WM,如openbox
。搜索有关桌面环境和分发的文章。