2013-02-28 50 views
0

再一次遇到一些我无法弄清楚如何工作的代码。我正在尝试创建一个SDL表面,加载一个位图图像并显示它。我的代码是这样的:SDL_BlitSurface无法正常工作 - 我无法看到我的表面上的图像

struct Image { 
    string  Name; 
    SDL_Surface* Surface; 
}; 

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR lpCmdL, INT nCmdS) { 
    // Will store our bitmap 
    Image NewImage; 

    // Initialization 
    SDL_Init(SDL_INIT_EVERYTHING); 

    // Create main window 
    SDL_Surface *Window = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF); 
    SDL_WM_SetCaption("MyApp", "MyApp"); 

    // Load image and make it compatible 
    SDL_Surface* Surf_Temp = NULL; 
    if((Surf_Temp = SDL_LoadBMP("myimage.bmp")) != NULL) { 
     NewImage.Name = "MyImage"; 
     NewImage.Surface = SDL_DisplayFormat(Surf_Temp); 
     SDL_FreeSurface(Surf_Temp); 
    } 

    // Draw image over the window 
    if (NewImage.Surface != NULL && Window != NULL) { 
     SDL_Rect DestR; 
       DestR.x = 0; 
       DestR.y = 0; 
     if (SDL_BlitSurface(NewImage.Surface, NULL, Window, &DestR) == -1) { 
      MessageBox(NULL, "Error", "Alert", MB_OK); 
     } 
    } 

    // Run 
    SDL_Event Event; 
    while(!End) { 
     while(SDL_PollEvent(&Event)) { 
      EventsHandler(&Event); 
     } 
    } 
    return 0; 
} 

那么,图像加载正确。我通过获取NewImage.Surface-> w(width)来验证它,这是正确的位图宽度。我没有收到任何错误信息(SDL_BlitSurface返回0),所以我不知道为什么窗口仍然是黑色的,没有图像显示。

+0

请检查您的BMP格式,是24位还是32位? – 2013-02-28 17:49:49

+0

它是24位,正如我所说的,至少,SDL_LoadBMP正确地获得其宽度和高度 – ali 2013-02-28 17:50:51

+0

将您的BMP转换为32位,它应该工作。 – 2013-02-28 17:51:14

回答

2

您需要拨打SDL_Flip以在您blit之后更新屏幕。

SDL_Flip(Window); 

阅读关于double buffering也。

+0

不错,我完全没有想到明显的事情。 – 2013-02-28 17:59:16

+0

我知道这样的事情不见了。谢谢 – ali 2013-02-28 18:11:14