我可以使用SDL_image在(png)中加載圖像沒有問題,也可以完美地顯示它。我想要做的是逐漸淡化從完全透明到完全不透明的形象。我看到一些教程提到SDL_SetAlpha
,但是這是用於SDL_Surface
,其中SDL_image加載爲SDL_Texture
用於硬件加速。SDL2中的紋理漸變 - 使用SDL_image
任何人都可以在保持良好性能的同時幫助解決這個問題嗎?
我可以使用SDL_image在(png)中加載圖像沒有問題,也可以完美地顯示它。我想要做的是逐漸淡化從完全透明到完全不透明的形象。我看到一些教程提到SDL_SetAlpha
,但是這是用於SDL_Surface
,其中SDL_image加載爲SDL_Texture
用於硬件加速。SDL2中的紋理漸變 - 使用SDL_image
任何人都可以在保持良好性能的同時幫助解決這個問題嗎?
所以這裏是我發現的。爲了渲染阿爾法紋理你只需要對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值進行平滑淡入淡出。
您是否嘗試了http://wiki.libsdl.org/moin.fcg/SDL_SetTextureAlphaMod? – 2013-04-01 21:27:26
我會試試看。謝謝@Armin。 – Zammalad
是的,似乎這樣做,所以我只需要解決如何平滑淡出從0到255.感謝那@Armin。 – Zammalad