2013-05-29 19 views
0

假設我們有一個32位PNG文件,其中包含一些以半透明方式繪製的幽靈/隱形字符。它在每個地方都不是同樣透明的,所以我們需要將每個像素的alpha信息加載到表面。C++/SDL:淡出已具有每像素alpha信息的表面

對於淡入/淡出,設置整個表面的alpha值是一個好方法;但不是在這種情況下,因爲表面已經具有每像素信息並且SDL不將這兩者結合起來。

什麼是有效的解決方法(而不是要求藝術家爲角色提供一些非常好的淡入/淡出動畫)?

回答

1

我想爲你實現你想要的結果,最簡單的方法是通過加載包含你的性格精靈的source表面開始,那麼,你的鬼的每個實例創建表面的working副本。您需要做的是每次實例的Alpha值將SDL_BlitSurfacedocsource更改爲您的working副本,然後應用您的透明度(您應該將其保持爲0到1之間的浮點數),然後應用您在每個像素的alpha通道上的透明度。

在32位面的情況下,假設你最初裝載source和分配workingSDL_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_gfxhere)的啓發,但如果你只是這樣做的話,我不會爲此而煩心地去鏈接一個庫。

+0

看起來不錯!我會盡快嘗試這一點。 –

+0

工作過,謝謝!我也用工作 - >格式 - > BytesPerPixel替換4s,並使用SDL_BYTEORDER來檢查字節順序。 –