Сегодня мы будем учится применять хромакей (color key). По-русски это означает, что этот урок научит вас удалять цвет фона при копировании поверхности.Структура SDL_Surface имеет элемент под названием color key. Хромакей это цвет который вы не хотите копировать при копировании поверхности. Это то, что используется для получения прозрачного фона. Скажем вы хотите скопировать фигуру из линий по имени Foo на такой фон: Но вы не хотите, чтобы вылезал голубой фон с изображения фигуры:Для того чтобы голубой цвет фона не появился нужно сделать хромакей равным цвету фона (в данном случае RGB #00FFFF). Обычно хромакей устанавливается при загрузке изображения.

SDL_Surface *load_image( std::string filename ) {
    //Временное хранилище для загружаемого изображения
    SDL_Surface* loadedImage = NULL;
    //Оптимизированное изображение, которое и будет использоваться
    SDL_Surface* optimizedImage = NULL;
    //Загрузить изображение
    loadedImage = IMG_Load( filename.c_str() );
    //Если изображение загружено
    if( loadedImage != NULL ) {
        //Создать оптимизированное изображение
        optimizedImage = SDL_DisplayFormat( loadedImage );
        //Освободить ресурсы из-под старого изображения
        SDL_FreeSurface( loadedImage );

Итак, это наша функция загрузки изображений, которую мы будем модифицировать. Во-первых мы загружаем и оптимизируем картинку, как и раньше.

        //Если изображение успешно оптимизировано
        if( optimizedImage != NULL ) {
            //Отобразить хромакей
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );

Затем мы проверяем получилось ли оптимизировать изображение. Если получилось, то мы должны должны отобразить цвет, который хотим использовать как хромакей. Мы вызываем SDL_MapRGB(), передавая значение красной, зеленой и синей компонент цвета, для того чтобы получить значение цвета для пикселя в формате поверхности. Подробнее о пикселях в этой статье (англ).

            //Сделать все пиксели с цветом R 0, G 0xFF, B 0xFF прозрачными
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
        }

Теперь пришло время сделать фактический кеинг. Первый аргумент это поверхность, для который мы хотим задать хромакей. Второй аргумент содержит флаги, которые мы хотим передать. Флаг SDL_SRCCOLORKEY, удостоверяется в том, что мы используем хромакей при копировании этой поверхности на другую. Третий аргумент это собственно сам хромакей. Как вы можете видеть, это тот самый цвет, который мы только что отобразили в формат поверхности.

    //Вернуть оптимизированное изображение
    return optimizedImage;
}

После этого функция загрузки изображений возвращает оптимизированную с примененным хромакеем поверхность.

    //Скопировать поверхность на экран
    apply_surface( 0, 0, background, screen );
    apply_surface( 240, 190, foo, screen );
    //Обновить экран
    if( SDL_Flip( screen ) == -1 ) {
        return 1;
    }

Теперь фоновое изображение скопировано, изображение фигуры с хромакеем также скопировано.И теперь нет голубого фона вокруг изображения человечка. Для тех кто использует PNG с прозрачностью: IMG_Load() самостоятельно позаботится о прозрачности. Попытка применить хромакей к изображению, которое уже содержит прозрачный фон, приведет к пугающим результатам. Также вы потеряете альфа канал, если будете использовать SDL_DisplayFormat() вместо SDL_DisplayFormatAlpha(). Для того чтобы у изображений в PNG формате осталась прозрачность, просто не применяйте к ним хромакей. Также, IMG_load умеет обрабатывать прозрачность изображений в формате TGA. Загляните в документацию по SDL за дополнительной информацией по данной технике.

Скачать исходники