0

この質問で述べたように、開発中の小さなゲームに SDL を使用しています。現在、SDL_DisplayFormatAlpha に問題があります。PNG 画像からアルファ チャネルを使用してサーフェスを作成しようとしています。以前は機能していましたが、少しリファクタリングを行ったところ、何かが壊れました。このコンストラクターに絞り込みました。


Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        surface = SDL_DisplayFormatAlpha( tempSurface );
        //surface = tempSurface;
    }
    SDL_FreeSurface( tempSurface );
}

これは問題なくコンパイルされますが、実行するとセグメンテーション エラーが発生します。gdb によって報告されたエラー:

プログラム受信信号 SIGSEGV、セグメンテーション違反。
[スレッド 0xb79c16c0 (LWP 8089) への切り替え]
/usr/lib/libSDL-1.2.so.0 からの SDL_DisplayFormatAlpha () の 0xb7e8b9a3

スタック トレースは次のとおりです。

#0 0xb7e8b9a3 in SDL_DisplayFormatAlpha () from /usr/lib/libSDL-1.2.so.0
#1 Surface の 0x0804987e (this=0x804d060, file=@0xbfb20760) at Surface.cpp:16
#2 画像内の 0x0804a159 (this=0x804d038, x=0, y=0, file=@0xbfb207a0)
    Image.cpp:16 で
#3 オブジェクト内の 0x0804a3de (this=0x804d028, imageFile=@0xbfb207dc)
    Object.cpp:4 で
#4 アプリケーションの 0x080491cb (this=0xbfb20810)、Application.cpp:8
#5 main () の 0x08048e0d at main.cpp:5

コメントアウトしてsurface = SDL_DisplayFormatAlpha( tempSurface ); コメントSDL_FreeSurface( tempSurface );を外すと、surface = tempSurface;次のようになります。



Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        //surface = SDL_DisplayFormatAlpha( tempSurface );
        surface = tempSurface;
    }
    //SDL_FreeSurface( tempSurface );
}

それからそれはうまくいくようです。誰が何が起こっているのか教えてもらえますか? 実際、SDL_DisplayFormatAlpha をコメントアウトすると、透明度も機能するようです。その関数は、アルファ チャネルをまだ持っていない画像でのみ使用することを意図していますか?

4

2 に答える 2

1

IMG_Load は、投稿メモの最後として、透明な PNG を自動的に処理する必要があります。スローされる実際の例外/エラーは何ですか? あなたのスタックトレースはそれを示していません。

于 2008-12-05T03:56:11.587 に答える
0

ここのリンクを読んだ場合(関連機能):

SDL_DisplayFormat

「SDL_DisplayFormat 関数を使用する前に SDL_Init を呼び出す必要があります。そうしないと、アクセス違反でプログラムがクラッシュします。」

それはあなたの問題でしょうか?

于 2008-12-05T07:24:23.790 に答える