3

SDL_imageを使用して問題なく(png)に画像をロードし、完全に表示することもできます。私がやりたいことは、画像を完全に透明から完全に不透明に徐々にフェードインすることです。いくつかのチュートリアルで言及されているのを見たことがありますが、これはハードウェア アクセラレーションと同様に SDL_image がロードされる場所でSDL_SetAlpha使用するためのものです。SDL_SurfaceSDL_Texture

優れたパフォーマンスを維持しながら、これを行う方法について誰か助けてもらえますか?

4

1 に答える 1

8

だからここに私が見つけたものがあります。テクスチャをアルファ付きでレンダリングするには、テクスチャへSetTextureAlphaModのポインタと 0 ~ 255 の範囲の整数を渡す呼び出しを行うだけです。

関数自体はここに文書化されています

注意。アルファ変調はレンダラーで常にサポートされているわけではありません。その場合、関数は -1 を返します (呼び出しが成功した場合は 0 を返します)。関数のドキュメントには、レンダラーがアルファ変調をサポートしているかどうかを検出する方法に関する情報があります。

私の問題の次の部分は、SDL_TRANSPARENT (0) から SDL_OPAQUE (255) へのスムーズなフェードを実行する方法でした。私は変数更新機能でこれを行いました(ゲームは固定および変数更新を使用しています)

#define FADE_SPEED 0.07f;

void SomeClass::UpdateVariable(float elapsedTime)
{
    // Check there is a texture
    if (texture) {
        // Set the alpha of the texture
        SDL_SetTextureAlphaMod(texture, alpha);
    }

    // Update the alpha value
    if (alpha < SDL_ALPHA_OPAQUE) {
        alphaCalc += FADE_SPEED * elapsedTime;
        alpha = alphaCalc;
    }

    // if alpha is above 255 clamp it
    if (alpha >= SDL_ALPHA_OPAQUE) {
        alpha = SDL_ALPHA_OPAQUE;
        alphaCalc = (float)SDL_ALPHA_OPAQUE;
    }
}

2 つのアルファ変数の使用に注意してください。alphaテクスチャ アルファを制御する関数に渡される実際の値であり、Uint8 です。float であり、0 から 255 まで徐々に増加する値を格納するために使用されます。更新関数の呼び出しごとに、経過したフレーム時間で乗算さalphaCalcれたスケーラー値によってこの値が更新されます。FADE_SPEED次に、実際のアルファ値に割り当てられます。これは、整数の丸めによってアルファ値のみを使用したスムーズなフェードが妨げられるため、スムーズなフェードを維持するために行われます。

于 2013-04-02T16:27:18.840 に答える