2013-04-01 77 views
3

我可以使用SDL_image在(png)中加載圖像沒有問題,也可以完美地顯示它。我想要做的是逐漸淡化從完全透明到完全不透明的形象。我看到一些教程提到SDL_SetAlpha,但是這是用於SDL_Surface,其中SDL_image加載爲SDL_Texture用於硬件加速。SDL2中的紋理漸變 - 使用SDL_image

任何人都可以在保持良好性能的同時幫助解決這個問題嗎?

+3

您是否嘗試了http://wiki.libsdl.org/moin.fcg/SDL_SetTextureAlphaMod? – 2013-04-01 21:27:26

+0

我會試試看。謝謝@Armin。 – Zammalad

+0

是的,似乎這樣做,所以我只需要解決如何平滑淡出從0到255.感謝那@Armin。 – Zammalad

回答

7

所以這裏是我發現的。爲了渲染阿爾法紋理你只需要對SetTextureAlphaMod一個電話傳遞一個指針質地和一個整數範圍爲0 - 255

函數本身是記錄here

NB。渲染器並不總是支持Alpha調製,如果情況如此,函數將返回-1(成功調用返回0)。功能文檔中有關於如何檢測渲染器是否支持alpha調製的信息。

我的問題的下一部分是如何執行從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; 
    } 
} 

注意使用兩個字母變量的。 alpha是傳遞給控制紋理alpha的函數的實際值,並且是Uint8。 alphaCalc是一個浮點數,用於存儲從0到255的逐漸增加的值。每次調用更新函數時,都會通過定標器值FADE_SPEED乘以經過的幀時間來更新此值。然後將其分配給實際的阿爾法值。這樣做是爲了保持平滑淡入淡出,因爲整數舍入可以防止使用單獨的alpha值進行平滑淡入淡出。