Предположим, у нас есть 32-битный файл PNG с неким призрачным / инкорпоральным символом, который рисуется полупрозрачным образом. Он не одинаково прозрачен в любом месте, поэтому нам нужна альфа-информация на пиксель при загрузке на поверхность.
Для постепенного исчезновения / затухания установка альфа-значения всей поверхности является хорошим способом; но не в этом случае, так как поверхность уже имеет информацию о пикселях, а SDL не объединяет их.
Каким будет эффективный обходной путь (вместо того, чтобы просить художника предоставить удивительную анимацию постепенного появления / исчезновения для персонажа)?
Я думаю, что самый простой способ достичь желаемого результата — начать с загрузки source
поверхность, содержащая ваши спрайты персонажа, то для каждого экземпляра вашего призрака создайте working
копия поверхности. То, что вы хотите сделать, это каждый раз, когда альфа-значение экземпляра изменяется, SDL_BlitSurface
(доктор) ваш source
в ваш working
скопируйте и затем примените свою прозрачность (которую вы, вероятно, должны хранить как плавающее число от 0 до 1), а затем примените свою прозрачность к альфа-каналу каждого пикселя.
В случае 32-битной поверхности, предполагая, что вы изначально загрузили source
и выделил working
SDL_Surface
s вы, вероятно, можете сделать что-то вроде:
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
(Вот), но если вы делаете только это, я бы не стал связываться с библиотекой только для этого.
Других решений пока нет …