1

Fedora 10 で最新の SDL/GFX ライブラリを使用しており、PNG または GIF 画像を画面にレンダリングしようとしています。透明な PNG をまったく表示できなかったので、透明な部分またはスプライトをすべて白に置き換えました (そしてマゼンタ 255,0,255 を試しました)。次のコードを使用すると、白透明の PNG が正常に表示されます。

SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = SDL_DisplayFormat(image);
SDL_SetColorKey(roto, SDL_SRCCOLORKEY, SDL_MapRGB( roto->format, 255,255,255 ));
SDL_BlitSurface( roto, NULL, surface, &offset );

しかし、スプライトを回転させようとすると、すべての白いピクセルがドロップされません。上記のコードを次のコードに置き換えて回転させます。

SDL_Surface *image = load_image("sprite-white.png");
SDL_Surface *roto = rotozoomSurface(image,  rotation_degrees, 1, 1);
SDL_Surface *roto2 = SDL_DisplayFormat(roto);
SDL_SetColorKey(roto2, SDL_SRCCOLORKEY, SDL_MapRGB( roto2->format, 255,255,255 ));
SDL_BlitSurface( roto2, NULL, surface, &offset );

いくつかの良いピクセルの周りに白い輪郭ができてしまいます。GIF 画像でも同じ結果が得られます。

透明な PNG/GIF ファイルを試したとき、SDL_SetColorKey を呼び出さなかったことを除いて、コードは同じでした。次に、PNGがまったく正しく表示されませんでした。私が見つけた奇妙なことの 1 つは、透明な PNG が MS ペイントでも SDL と同じように見えたのに、GIMP/Photoshop プログラムでは正しく開いたということでした。

宛先サーフェスの設定に欠けているものはありますか?

Googleはあまり現れませんでした。実際の例は素晴らしいでしょう。

4

2 に答える 2

2

「Fedora 10 の最新の SDL/GFX ライブラリ」と言うときは、SDL ライブラリと SDL_gfx ライブラリを意味していると思います。透明度のある PNG 画像を適切に表示するには、SDL_imageもインストールされていることを確認してください。PNG画像をSDL_Surfaceにロードできる別のライブラリがない限り、それが必要になります。

透過性のためにカラー キーを使用する必要はありません (もちろん、使用したい場合を除きます)。カラー キーの使用に関する問題については、SDL ドキュメントでは、SDL_DisplayFormat() を呼び出す前にカラー キーを設定することを推奨していることに注意してください。

「ハードウェア カラーキーまたはアルファ ブリット アクセラレーションを利用する場合は、この関数を呼び出す前にカラーキーとアルファ値を設定する必要があります。」

次のように, SDL_DisplayFormat() の代わりに SDL_DisplayFormatAlpha() を使ってみてください:

SDL_Rect imagePosition = { 50, 50, 0, 0 };
SDL_Surface *image = IMG_Load("example.png");
if (image != NULL) {
  image = SDL_DisplayFormatAlpha(image);
}

その後、レンダリング ループで、ソース イメージを浮動小数点angle数だけ SDL_Surface に回転させることができscreenます。

if (image != NULL) {
  SDL_Surface *rotation = rotozoomSurface(image, angle, 1, 1);
  SDL_BlitSurface(rotation, NULL, screen, &imagePosition);
  SDL_FreeSurface(rotation);
}

上記のコードは、PNG が適切な透明度を持っていると仮定すると、透明度のある PNG を適切にブリットします。

Fedora 10 のインストールで g++ を使用していると仮定して-lSDL_image、SDL_image ライブラリと SDL_gfx ライブラリを必ずリンクしてください。SDL 自体に必要な g++ 引数に-lSDL_gfxも使用できます。sdl-config --libs

于 2009-12-02T06:56:59.763 に答える
0

Rotozoomsurface のアンチエイリアシングをオフにするだけで、「アウトラインの問題」に悩まされることはなくなります。

あなたはこれを使用しました:SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 1);

代わりにこれを使用してください:SDL_Surface *roto = rotozoomSurface(image, rotation_degrees, 1, 0);

0 はアンチエイリアシングをオフに設定します。

于 2012-08-06T10:41:21.180 に答える