SDL_VIDEORESIZE 事件中的奇怪高度值
Strange height value in the SDL_VIDEORESIZE event
我正在尝试使用 SDL 创建应用程序,并希望调整 window 的大小。
目前,如果我尝试最大化 window,它会起作用,如果我将它放在屏幕的左半边或右半边,它会起作用并采用正确的尺寸。
但是,当我通过拖动其中一侧(垂直或水平)来调整 window 的大小时,会发生一些非常奇怪的事情:高度增长直到它等于屏幕的高度。
增长的时候,我看到它不是瞬间的,实际上需要很多次,每次增长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);
}
}
所以问题似乎不在我的代码中。 (为了验证这一点,我安装了一个使用SDL(Briquolo)的游戏,它也有同样的问题)
我在网上搜索了一下,好像只有我一个人遇到这个问题(或者可能是我没用好关键词),看来不是SDL的问题。
问题可能是由我的系统引起的。
有关信息,请获取 Ubuntu 16.10 64 位,使用 Gnome 桌面。
如何在没有副作用的情况下解决这个问题?
终于找到了避免这种情况的方法(但我不太明白为什么第一种方法不起作用):
如果我存储新尺寸,处理所有事件,然后调整尺寸,它就可以工作。这是工作代码:
#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);
}
我正在尝试使用 SDL 创建应用程序,并希望调整 window 的大小。
目前,如果我尝试最大化 window,它会起作用,如果我将它放在屏幕的左半边或右半边,它会起作用并采用正确的尺寸。 但是,当我通过拖动其中一侧(垂直或水平)来调整 window 的大小时,会发生一些非常奇怪的事情:高度增长直到它等于屏幕的高度。
增长的时候,我看到它不是瞬间的,实际上需要很多次,每次增长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);
}
}
所以问题似乎不在我的代码中。 (为了验证这一点,我安装了一个使用SDL(Briquolo)的游戏,它也有同样的问题)
我在网上搜索了一下,好像只有我一个人遇到这个问题(或者可能是我没用好关键词),看来不是SDL的问题。
问题可能是由我的系统引起的。 有关信息,请获取 Ubuntu 16.10 64 位,使用 Gnome 桌面。
如何在没有副作用的情况下解决这个问题?
终于找到了避免这种情况的方法(但我不太明白为什么第一种方法不起作用):
如果我存储新尺寸,处理所有事件,然后调整尺寸,它就可以工作。这是工作代码:
#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);
}