SDL 2.0 BMP Blit 屏幕/更新不会显示图片
SDL 2.0 BMP Blit screen / Update won't show picture
我 运行 遇到了让我的照片显示的问题。我无法让图片显示在 window。
我不小心 运行 程序两次(两次 windows),第二次 window 里面有图像。我可以关闭第一个,图像保留在第二个 window 中。如果我将 window 左右移动,它看起来很粗略。
说了这么多想问的是,为什么我的图只能出现在第二(三四)window,而不是原图
这是代码。
#include <iostream>
#include <SDL.h>
int main(int argc, char ** argv)
{
bool quit = false;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window * gWindow = SDL_CreateWindow("SDL_Yo",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640,480,SDL_WINDOW_SHOWN );
SDL_Surface* gScreenSurface = SDL_GetWindowSurface( gWindow );
if( gScreenSurface == NULL )
{
SDL_Quit();
}
SDL_Surface* gHelloWorld = SDL_LoadBMP("IMG_0004.bmp");
if( gHelloWorld == NULL )
{
SDL_Quit();
}
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
quit = SDL_UpdateWindowSurface( gWindow );
while (!quit)
{
SDL_WaitEvent(&event);
switch (event.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Quit();
return 0;
}
您不能只将要绘制的内容扔出一次并期望它保留在屏幕上。您所描述的问题正是 window 经理的运作方式 - 如果您的 window 的某些部分未显示,则无需更新。但是一旦它再次可见,window 管理器会向您发送一条消息,要求您重新绘制,因为任何地方都没有图像数据,显示系统也没有任何可显示的内容。您没有重绘,因此显示了一些垃圾(之前存在的东西)。
至于为什么您一开始没有看到图像,即使没有任何东西遮盖您的 window - 是因为您显示图像的时间过早。同样的道理,当你需要绘制时,SDL 给你一个事件。
适当的事件循环应该是这样的:
while (!quit)
{
// get all events from event queue
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
// all your display 'redraw' stuff here
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
SDL_UpdateWindowSurface( gWindow );
}
如果你真的想要 SDL_WaitEvent,你应该注意 SDL_WINDOWEVENT 与 SDL_WINDOWEVENT_EXPOSED 和 SDL_WINDOWEVENT_SHOWN 标志作为重绘的信号。
我 运行 遇到了让我的照片显示的问题。我无法让图片显示在 window。
我不小心 运行 程序两次(两次 windows),第二次 window 里面有图像。我可以关闭第一个,图像保留在第二个 window 中。如果我将 window 左右移动,它看起来很粗略。
说了这么多想问的是,为什么我的图只能出现在第二(三四)window,而不是原图
这是代码。
#include <iostream>
#include <SDL.h>
int main(int argc, char ** argv)
{
bool quit = false;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window * gWindow = SDL_CreateWindow("SDL_Yo",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640,480,SDL_WINDOW_SHOWN );
SDL_Surface* gScreenSurface = SDL_GetWindowSurface( gWindow );
if( gScreenSurface == NULL )
{
SDL_Quit();
}
SDL_Surface* gHelloWorld = SDL_LoadBMP("IMG_0004.bmp");
if( gHelloWorld == NULL )
{
SDL_Quit();
}
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
quit = SDL_UpdateWindowSurface( gWindow );
while (!quit)
{
SDL_WaitEvent(&event);
switch (event.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Quit();
return 0;
}
您不能只将要绘制的内容扔出一次并期望它保留在屏幕上。您所描述的问题正是 window 经理的运作方式 - 如果您的 window 的某些部分未显示,则无需更新。但是一旦它再次可见,window 管理器会向您发送一条消息,要求您重新绘制,因为任何地方都没有图像数据,显示系统也没有任何可显示的内容。您没有重绘,因此显示了一些垃圾(之前存在的东西)。
至于为什么您一开始没有看到图像,即使没有任何东西遮盖您的 window - 是因为您显示图像的时间过早。同样的道理,当你需要绘制时,SDL 给你一个事件。
适当的事件循环应该是这样的:
while (!quit)
{
// get all events from event queue
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
// all your display 'redraw' stuff here
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
SDL_UpdateWindowSurface( gWindow );
}
如果你真的想要 SDL_WaitEvent,你应该注意 SDL_WINDOWEVENT 与 SDL_WINDOWEVENT_EXPOSED 和 SDL_WINDOWEVENT_SHOWN 标志作为重绘的信号。