Программирование графики

Xakep, номер #043, стр. 043-066-1


Улучшенные спрайты

Horrific aka Фленов Михаил (smirnandr@mail.ru) www.cydsoft.com/vr-online

Наши знания уже дошли до такого уровня, что мы готовы создавать простые в использовании демки на основе спрайтов. Единственное, чего нам не хватает, так это прозрачности. Пока что я показал, как полностью вывести спрайт. Но чаще всего нужно использовать при выводе прозрачность, чтобы одна картинка накладывалась поверх другой.

Теория

Допустим, что у нас есть две картинки, показанные на рисунке 1 и на рисунке 2. Изображение первого рисунка мы уже использовали в наших прогах в качестве фона и сегодня оно будет выполнять ту же функцию. Изображение на втором рисунке мы сегодня выведем поверх фона. При этом нам надо вывести только самолет, а цвет фона должен быть проигнорирован.

Задача достаточно простая, но в то же время требует немного дополнительных усилий. В DirectDraw она решается следующим образом:

1. После загрузки изображения в поверхность надо указать, какой цвет должен быть прозрачным.

2. Во время вывода поверхности с изображением на экран указать, что при выводе надо учитывать цвет прозрачности. При этом из поверхности изображения будет копироваться все, кроме цвета прозрачности, т.е. только самолет.

Шкодинг

Загружай пример, описанный в прошлом номере Х, сейчас мы его подкорректируем. Я больше не буду давать полный исходник примеров, потому что они постоянно растут, а размер журнала остается тем же. Поэтому здесь будет только описание, а исходник будет выкладываться на моем сайте или на диске к этому номеру Х.

Для начала заведи в разделе var новую переменную поверхности для хранения изображения самолета:

FTransImageSurface : IDirectDrawSurface7;

Теперь найди то место, где мы загружаем картинку фона. После загрузки фона нужно добавить следующие две строчки:

FTransImageSurface := DDLoadBitmap(FDirectDraw, '2.bmp', 0, 0);

DDSetColorKey(FTransImageSurface, RGB(255, 0, 255));

В первой строке я загружаю картинку с именем 2.bmp в поверхность FTransImageSurface. Процесс такой же, как и при загрузке фона, поэтому тут не должно быть вопросов. Я только напомню, что картинка 2.bmp должна находиться в той же директории, что и прога, иначе нужно указывать полный или относительный путь к файлу.

Во второй строке этого кода я указываю для поверхности FTransImageSurface цвет прозрачности с помощью функции DDSetColorKey. У нее два параметра:

1. Поверхность, у которой надо установить цвет прозрачности. Нам надо здесь указать FTransImageSurface.

2. Значение цвета, который будет использоваться в качестве прозрачного. Чтобы указать цвет, я использую функцию RGB(Красный, Зеленый, Синий). У этой функции три параметра, которые указывают красную, зеленую и синюю составляющую цвета. Каждая составляющая изменяется от 0 до 255. Если у тебя в качестве прозрачности используется красный цвет, то нужно указать RGB(255, 0, 0).

Лично я люблю использовать цвет со значениями RGB(255, 0, 255).

Уроки рисования

Картинка загружена и уже указан цвет, который будет использоваться в качестве прозрачного. Теперь нам осталось только вывести ее на экран.

Содержание  Вперед на стр. 043-066-2