2

現在、次のようなボタン クラスを作成しようとしています。

void Button::apply_image(std::string path) {

    SDL_Surface* loaded_image = NULL;
    loaded_image = IMG_Load(path.c_str());
    m_button_image = SDL_DisplayFormat(loaded_image);
    SDL_FreeSurface(loaded_image);

}

void Button::show(SDL_Surface* screen) {
    SDL_BlitSurface(m_button_image, NULL, screen, &m_box);
}

クラスを使用するときは、次のことを行います。

Button button1(0,0,50,50);
button1.apply_image("images/cards/1.png");

SDL_Surface* screen = NULL;

screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
SDL_WM_SetCaption("House Of Cards", NULL);

button1.show(screen);
SDL_Flip(screen);

私の問題は、使用すると画像が表示されないことですがSDL_DisplayFormat(loaded_image); 、その行とSDL_FreeSurface(loaded_image);. 次に、画像に変更loaded_image = IMG_load(path.c_str());m_button_image = IMG_Load(path.c_str());て表示します。DisplayFormat()を呼び出さないと画像が表示されるため、パスが明らかに正しいため、何か間違っていますか?gdb を使用すると、m_button_image が NULL になり、その理由がわかりません。なぜなら、gdb は、loaded_image が SDL_Surface* を指していることも示しているからです。

4

2 に答える 2

1

それで、私は問題が何であるかを理解しました。画面を初期化する前に SDL_DisplayFormat を呼び出していました。関数の順序が間違っていたため、SDL_DisplayFormat には画像を変換するためのサーフェスがありませんでした。

于 2012-10-30T15:42:14.140 に答える
0

http://sdl.beuc.net/sdl.wiki/SDL_DisplayFormatから:「変換が失敗したり、メモリ不足になったりすると、NULL が返されます」

SDL_DisplayFormatの呼び出しが何らかの理由で失敗しているようです.SDL_DisplayFormatの呼び出しの後にm_button_image==NULLをチェックすると便利でしょう.NULLの場合はSDL_GetError()を使用してエラーの原因を確認してください.

それでも解決しない場合はどうなるかわかりませんが、変換されていない画像を表示フォーマットされたサーフェスにブリットし、それを画像として使用することで、より遅い変換を行うことができます(ほとんど同じですが、もう少し複雑で、実際には SDL_DisplayFormat の呼び出しを避けるだけです)

于 2012-10-30T15:37:38.413 に答える