Я делаю игру с SDL2.У меня есть спрайт-лист, который я загружаю как текстуру, и я рисую спрайты из него в окне игры, например:
SDL_RenderCopy(renderer, sprite_sheet_texture, &src_rect, &dst_rect);
SDL_RenderPresent(renderer);
Я хочу специально изменить цвет каждого черного пикселя.каждого спрайта в текстуре во время игры.По сути, я хочу создать эффект непрерывного свечения от черного до белого и снова черного.
Вот пример того, как спрайт выглядит в игре
Вот как выглядит эффект, который я надеюсь достичь
Единственный способ, который я смог найти, - это прочитать данные пикселей из текстуры листа спрайта и вручную обновитьцвет каждого черного пикселя до более светлого оттенка.Затем сделайте это снова и обновите этот более светлый цвет пикселя до более светлого, пока не будет достигнут самый светлый, и повторите процесс в обратном порядке.
Код (только для первого шага черных пикселей -> более светлый оттенок приминимум) будет выглядеть примерно так:
Uint32* pixels;
int pitch;
SDL_LockTexture(sprite_sheet_texture, NULL, &pixels, &pitch);
SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_RGBA8888, pixels, pitch);
// Get pixel count
SDL_PixelFormat* mapping_format = SDL_AllocFormat(SDL_PIXELFORMAT_RGBA8888);
int pixel_count = (pitch / mapping_format->BytesPerPixel) * sprite_sheet_height;
// Swap every black pixel to a lighter shade
Uint32 from_pixel = SDL_MapRGBA(0, 0, 0, 255);
Uint32 to_pixel = SDL_MapRGBA(24, 24, 24, 255);
for (int i = 0; i < pixel_count; i++) {
if (pixels[i] == from_pixel} {
pixels[i] = to_pixel;
}
}
SDL_FreeFormat(mapping_format);
SDL_UnlockTexture(streaming_texture);
У этого метода есть пара проблем:
Это медленно.Я еще не тестировал его, но документация SDL предостерегает от частого использования SDL_RenderReadPixels
, поскольку это «очень медленная операция».Мне пришлось бы запускать приведенный выше код несколько раз в секунду.
Мой спрайт-лист не смог бы иметь определенные значения пикселей в нем.Например, если я обновляю пиксели с «0, 0, 0» до «24, 24, 24», а затем до «48, 48, 48», я должен убедиться, что спрайт-лист не имеетодин пиксель со значениями «24, 24, 24» или «48, 48, 48», поскольку вышеуказанная функция также обновляет эти пиксели, а я просто хочу обновить те, которые изначально были черными.
Есть ли лучший способ сделать это?