|

Программирование графики
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
|