C ++ / SDL: затухание поверхности, уже имеющей альфа-информацию на пиксель

Предположим, у нас есть 32-битный файл PNG с неким призрачным / инкорпоральным символом, который рисуется полупрозрачным образом. Он не одинаково прозрачен в любом месте, поэтому нам нужна альфа-информация на пиксель при загрузке на поверхность.

Для постепенного исчезновения / затухания установка альфа-значения всей поверхности является хорошим способом; но не в этом случае, так как поверхность уже имеет информацию о пикселях, а SDL не объединяет их.

Каким будет эффективный обходной путь (вместо того, чтобы просить художника предоставить удивительную анимацию постепенного появления / исчезновения для персонажа)?

0

Решение

Я думаю, что самый простой способ достичь желаемого результата — начать с загрузки source поверхность, содержащая ваши спрайты персонажа, то для каждого экземпляра вашего призрака создайте working копия поверхности. То, что вы хотите сделать, это каждый раз, когда альфа-значение экземпляра изменяется, SDL_BlitSurface (доктор) ваш source в ваш working скопируйте и затем примените свою прозрачность (которую вы, вероятно, должны хранить как плавающее число от 0 до 1), а затем примените свою прозрачность к альфа-каналу каждого пикселя.

В случае 32-битной поверхности, предполагая, что вы изначально загрузили source и выделил working SDL_Surfaces вы, вероятно, можете сделать что-то вроде:

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 (Вот), но если вы делаете только это, я бы не стал связываться с библиотекой только для этого.

1

Другие решения

Других решений пока нет …