2017-04-12 18 views
0

私はこの単純な効果をどのように行うかについて、私の頭を悩ましています。私は画像を持っています(下記参照)。この画像がゲームで使用されると、時計回りの黒の効果への移行が生じます。私はSDL(2)でこの効果を再現しようとしていますが、無駄です。私はそれがマスキングと関係があることを知っていますが、コードでそれをどうやって行うのか分かりません。SDL2と白黒マスクを使用したアニメーショントランジション/ワイプ?

最も近いのは「SDL_SetColorKey」を使用してRGB値をインクリメントすることで、ではなく、はアニメーションの「ワイピング」部分を描画します。

Uint32 colorkey = SDL_MapRGBA(blitSurf->format, 
    0xFF - counter, 
    0xFF - counter, 
    0xFF - counter, 
    0 
); 
SDL_SetColorKey(blitSurf, SDL_TRUE, colorkey); 

// Yes, I'm turning the surface into a texture every frame! 
SDL_DestroyTexture(streamTexture); 
streamTexture = SDL_CreateTextureFromSurface(RENDERER, blitSurf); 

SDL_RenderCopy(RENDERER, streamTexture, NULL, NULL); 

私は何度も検索していますが、私自身の好奇心と正気のための答えが絶望的です。私はこの質問がSDLに特有のものではないと思います。私はちょうどこれについて考える方法を知る必要があります!

答えて

0

は任意に解決策を考え出しました。それは高価ですが、機能します。画像内のすべてのピクセルを反復などのような色をマッピングすることによって:

int tempAlpha = (int)alpha + (speed * 5) - (int)color; 
int tempColor = (int)color - speed; 
*pixel = SDL_MapRGBA(fmt, 
       (Uint8)tempColor, 
       (Uint8)tempColor, 
       (Uint8)tempColor, 
       (Uint8)tempAlpha 
      ); 

アルファ画素の現在のアルファである場合、速度は、アニメーションのパラメータ化速度であり、色がピクセルの現在の色であります。 fmtはイメージのSDL_PixelFormatです。これは、次の黒からフェージングのためのものである、黒にフェージングするためのものである:

origColorは、元のグレースケール画像の画素の色である
if ((255 - counter) > origColor) 
       continue; 
int tempAlpha = alpha - speed*5; 
*pixel = SDL_MapRGBA(fmt, 
       (Uint8)0, 
       (Uint8)0, 
       (Uint8)0, 
       (Uint8)tempAlpha 
      ); 

私はこのすべてを行うための簡単なAPIを作成しましたので、気軽にチェックしてください:https://github.com/Slynchy/SDL-AlphaMaskWipes

関連する問題