假設我們有一個32位PNG文件,其中包含一些以半透明方式繪製的幽靈/隱形字符。它在每個地方都不是同樣透明的,所以我們需要將每個像素的alpha信息加載到表面。C++/SDL:淡出已具有每像素alpha信息的表面
對於淡入/淡出,設置整個表面的alpha值是一個好方法;但不是在這種情況下,因爲表面已經具有每像素信息並且SDL不將這兩者結合起來。
什麼是有效的解決方法(而不是要求藝術家爲角色提供一些非常好的淡入/淡出動畫)?
假設我們有一個32位PNG文件,其中包含一些以半透明方式繪製的幽靈/隱形字符。它在每個地方都不是同樣透明的,所以我們需要將每個像素的alpha信息加載到表面。C++/SDL:淡出已具有每像素alpha信息的表面
對於淡入/淡出,設置整個表面的alpha值是一個好方法;但不是在這種情況下,因爲表面已經具有每像素信息並且SDL不將這兩者結合起來。
什麼是有效的解決方法(而不是要求藝術家爲角色提供一些非常好的淡入/淡出動畫)?
我想爲你實現你想要的結果,最簡單的方法是通過加載包含你的性格精靈的source
表面開始,那麼,你的鬼的每個實例創建表面的working
副本。您需要做的是每次實例的Alpha值將SDL_BlitSurface
(doc)source
更改爲您的working
副本,然後應用您的透明度(您應該將其保持爲0到1之間的浮點數),然後應用您在每個像素的alpha通道上的透明度。
在32位面的情況下,假設你最初裝載source
和分配working
SDL_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_gfx
(here)的啓發,但如果你只是這樣做的話,我不會爲此而煩心地去鏈接一個庫。
看起來不錯!我會盡快嘗試這一點。 –
工作過,謝謝!我也用工作 - >格式 - > BytesPerPixel替換4s,並使用SDL_BYTEORDER來檢查字節順序。 –