2011-07-24 24 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を、取得しています。この場合は、背景がNULLであるため、バックグラウンドではwとhです。

+0

は、それがエラーまたは実行時エラーをコンパイルするのですか? –

+0

私は私の質問を編集しました。そのランタイムエラー – calccrypto

+0

したがって、open_imageにエラーがありますか?どこから? SDL_LoadBMPはすでにNULLになっていますか?それともSDL_DisplayFormatですか? – Bart

答えて

2

これまでに一度SDL_SetVideoModeを呼び出すことなくSDL_DisplayFormatを呼び出すことはできません。

私はあなたのコードを修正:

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_DisplayFormatはSDL_SetVideoModeでのみ指定したbppとフラグに依存しているためです。( – calccrypto

+1

) –