0

半透明の方法で描かれた幽霊/非実体のキャラクターの 32 ビット PNG ファイルがあるとします。すべての場所で同じように透明であるとは限らないため、サーフェスにロードするときにピクセルごとのアルファ情報が必要です。

フェードイン/フェードアウトの場合、サーフェス全体のアルファ値を設定するのが良い方法です。ただし、この場合はそうではありません。サーフェスには既にピクセルごとの情報があり、SDL は 2 つを結合しないからです。

効率的な回避策は何ですか (アーティストに素晴らしいフェードイン/アウト アニメーションをキャラクターに提供するよう依頼する代わりに)?

4

1 に答える 1

1

希望する結果を得る最も簡単な方法は、キャラクター スプライトを含むサーフェスをロードすることから始めてsource、ゴーストのインスタンスごとworkingにサーフェスのコピーを作成することだと思います。あなたがしたいことは、インスタンスのアルファ値が変更されるたびに、SDL_BlitSurfacedoc)あなたのコピーsourceにあなたworkingを適用し、次に透明度を適用し(おそらく0と1の間の浮動小数点数として保持する必要があります)、次に透明度を適用しますすべてのピクセルのアルファ チャネル。

source32 ビット サーフェスの場合、最初に をロードして割り当てたと仮定すると、working SDL_Surfaceおそらく次の行に沿って何かを実行できます。

SDL_BlitSurface(source, NULL, working, NULL);
if(SDL_MUSTLOCK(working)) 
{
    if(SDL_LockSurface(working) < 0) 
    {
        return -1;
    }
}

Uint8 * pixels = (Uint8 *)working->pixels;
pitch_padding = (working->pitch - (4 * working->w));
pixels += 3; // Big Endian will have an offset of 0, otherwise it's 3 (R, G and B)
for(unsigned int row = 0; row < working->h; ++row) 
{
    for(unsigned int col = 0; col < working->w; ++col) 
    {
        *pixels = (Uint8)(*pixels * character_transparency); // Could be optimized but probably not worth it
        pixels += 4;
    }
    pixels += pitch_padding;
}

if(SDL_MUSTLOCK(working)) 
{
    SDL_UnlockSurface(working);
}

このコードはSDL_gfx( here ) から着想を得たものですが、それだけを行っているのであれば、そのためだけにライブラリにリンクする必要はありません。

于 2013-05-30T04:19:11.440 に答える