Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Часть 8. Прозрачность, битовый перенос со свойством прозрачности


Давайте теперь рассмотрим важное средство в программировании игр: прозрачность.

Битовый перенос со свойством прозрачности

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

Спрайты обычно обладают комплексной нерегулярной границей и могут также иметь внутри себя отверстия в пределах области, определенной этой границей. Рисовать такое нерегулярное изображение вместе с рассчитанным на него кодом было бы утомительно и слишком медленно. Вместо этого мы создаем растровое изображение спрайта. Однако, растровое изображение - это всегда заполненный прямоугольный блок, а спрайты, как я уже говорил, редко заполняются полностью.
Таким образом, нам необходим механизм, посредством которого мы могли бы определять прозрачные области растрового блока. Одним из способов осуществления этого является определение цвета или диапазона цветов, которые могут быть использованы для задания прозрачных пикселей. Любой пиксель с этим цветом не рисуется во время переноса, оставляя пиксель фона на своем месте. Это создает эффект видимости изображения фона в просветах и на границах спрайта. Эта техника известна как манипулирование с исходным цветом.

DirectDraw имеет богатое обеспечение для других типов манипулирования с цветом, однако для этой демонстрационной программы (и, вероятно, для большей части кода, которую вы напишете) вполне подходит базовый тип манипулирования.
Все, что вам необходимо сделать. - сообщить DirectDraw цвет, который вы хотели бы сделать прозрачным. Ввиду того, что вы используете здесь 256-цветный растр, вы фактически указываете индекс цвета в палитре; то есть, индекс цвета в таблице цветов DIB. Чтобы это сделать, заполните достаточно простую запись TDDColorKey, Она состоит из начального и конечного цветов для цветного ключа. Вы используете только один цвет, поэтому начальное и конечное значения одинаковы. На время написания этоп книги оказалось, что DirectDraw в любом случае поддерживает только одноцветный исходный ключ. Как только цветовые значения будут заполнены, вызовите метод SetColorKey IDirectDrawSurface, сообщающий ему, что вы хотите использовать его в качестве исходного ключа при переносе. Добавьте эти строки к FormShow:

ColorKey.dwColorSpaceLowValue := 0 ;
ColorKey.dwColorSpaceHighValue := 0 ;

if Image. SetColorKey ( DDCKEY_SRCBLT, ColorKey ) <> DD_OK then
Raise Exception. Create ( ' SetColorKey failed ' ) ;

ColorKey является локальной переменной типа TDDColorKey.Вы должны не забывать освобождать поверхность Image, для чего следует добавить строку FormDestroy для того, чтобы освободить ее после освобождения основной поверхности.
Затем измените DrawSurface еще раз. На этот раз вы должны перезагрузить растровое изображение. Я также добавил некоторый комментарий для тех, кто запускает демонстрационную программу, как представлено в листинге 21.

Листинг 21 Добавление комментария к фону.

procedure TFormI. DrawSurfaces ;
begin

// перегрузить фоновое изображение
DDReloadBitmap( Image, GetBitmapName ) ;

// вывести некоторые дополнительные советы о клавишах управления курсором
with TDDCanvas. Create ( Image ) do try
Font. Name := 'Arial' ;
Font. Size := 14 ;
Font. Color := clWhite ;
Brush. Style := bsClear ;

Text0ut( 0, 0, 'Try cursor keys with and without Shift.' ) ;
TextOutt 0, TextHeight( 'A' ),

' Use combinations such as Left+Up for diagonal movement. ' ) ;
Text0ut( 0, TextHeight( 'A' ) * 2,

1-3 selects the torus to move, 0 selects all.' ) :
finally

Free ;
end ;
end ;

Еще раз, заметьте использование try...Finally вокруг TDDCanvas для гарантии освобождения TDDCanvas.

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz