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 标志作为重绘的信号。