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

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


Напоминаю, что картинку фона мы выводили с помощью метода BltFast следующим образом:

FPrimarySurface.BltFast (175, 75, FImageSurface, nil, DDBLTFAST_WAIT);

Этот код копирует содержимое поверхности FimageSurface (указана в качестве третьего параметра) во вторичный буфер - FPrimarySurface. Первые два параметра указывают на левую и верхнюю позиции картинки. В последнем параметре мы указывали только DDBLTFAST_WAIT - если вывод сейчас невозможен, то необходимо ожидание возможности вывода.

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

Вот пример вывода нашей картинки, который надо вставить сразу после вывода фона:

srcrect:=Rect(0,0,180,90);

FPrimarySurface.BltFast (200, 200, FTransImageSurface, @srcrect,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

Указатели

Заметь, что при вызове BltFast в качестве четвертого параметра указана переменная srcrect. Точнее сказать, тут используется только адрес структуры @srcrect в памяти. Значок @ указывает на то, что нужно использовать не саму переменную, а только ее адрес.

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

Теперь допустим, что у тебя есть какая-то переменная (любого типа) размером с пару мегабайт. Когда ты вызываешь какую-то процедуру и передаешь ей эту переменную, то все содержимое переменной записывается в стек, что отнимает много времени и расходует лишнюю память. Чтобы не делать такого бессмысленного копирования, ты должен всего лишь передать в процедуру указатель на переменную в памяти. Любой указатель занимает всего 4 байта, и только они будут копироваться в стек. После того как процедура начнет свое выполнение, она прочитает указатель и спокойно по нему найдет нужные данные в системной памяти.

Итак, чтобы получить адрес любой переменной нужно писать так: "@Переменная" (без кавычек, конечно же). Чтобы увидеть содержимое, находящееся по определенному адресу (иногда еще говорят "указатель", потому что адресная переменная указывает на данные в памяти), нужно написать так - "Адрес^" (после переменной указателя поставить значок ^).

Работа с размерами

Теперь разберемся с четвертым параметром метода BltFast. Как ты уже понял, там передается указатель на структуру srcrect. Сама структура объявлена в разделе var следующим образом.

var

srcrect:TRect;

Структура TRect - это всего лишь запись из 4-х значений - левой, верхней, правой и нижней позиций. В нашем случае в такой структуре мы будем передавать позиции картинки, которую надо вывести. Конечно же, мы можем вывести всю картинку, указав вместо структуры значение nil, но в следующий раз нам понадобится именно структура для создания первой анимации.

Назад на стр. 043-066-1  Содержание  Вперед на стр. 043-066-3