2011-07-24 23 views
0

我與SDL瞎搞之前,我決定把打開的圖像爲背景,以主「屏幕」的程序,並使其動態的,所以不同大小的圖像將導致不同大小的屏幕。問題是,我不明白爲什麼它不讓我。我可以編譯,但是當我嘗試創建屏幕時,程序會報錯,因爲背景圖像因某些未知原因而被清空。任何想法爲什麼?SDL使影像畫面不工作

程序是非常小:

#include <iostream> 
#include "SDL/SDL.h" 
#define bpp 32 

int init(){ 
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1) 
     return 1; 
    // will init ttf later 
    return 0; 
} 

SDL_Surface * open_image(std::string image_name){ 
    SDL_Surface * loaded_image = SDL_LoadBMP(image_name.c_str()); 
    if (loaded_image){ 
     SDL_Surface * optimized_image = SDL_DisplayFormat(loaded_image); // becomes NULL 
     SDL_FreeSurface(loaded_image); 
     return optimized_image; 
    } 
    return loaded_image; 
} 

int main(int argc, char * argv[]){ 
    if (init()) 
     return 1; 

    SDL_Surface * background = open_image("hello.bmp"); 
    SDL_Surface * screen = SDL_SetVideoMode(background -> w, background -> h, bpp, SDL_SWSURFACE); // erroring here 

    SDL_BlitSurface(background, NULL, screen, NULL); 
    if (SDL_Flip(screen) == -1) 
     return 1; 
    bool quit = false; 
    SDL_Event event; 
    while (!quit) 
     while (SDL_PollEvent(&event)) 
      if (event.type == SDL_QUIT) 
       quit = true; 
    return 0; 
} 

我收到提示3,這顯然是訪問不存在的值。在這種情況下,背景爲w和h,因爲背景爲NULL,即使它不應該是

+0

是編譯錯誤或運行時錯誤? –

+0

我編輯了我的問題。它的運行時錯誤 – calccrypto

+0

所以錯誤是在open_image?從哪裏來? SDL_LoadBMP已經導致NULL還是SDL_DisplayFormat? – Bart

回答

2

您不能在調用SDL_DisplayFormat而不調用SDL_SetVideoMode之前一次。

我定你的代碼:

SDL_Surface * screen = SDL_SetVideoMode(512, 512, bpp, SDL_SWSURFACE); 
    SDL_Surface * background = open_image("hello.bmp"); 
    screen = SDL_SetVideoMode(background -> w, background -> h, bpp, SDL_SWSURFACE); 
+0

真的嗎?哇。我想我有一個關於sdl的投訴:( – calccrypto

+1

這是因爲SDL_DisplayFormat取決於bpp和你只在SDL_SetVideoMode中給出的標誌。 –