http://seprize.narod.ru

Блитинг

< Часть 1 | Часть 2 | Часть 3 >

Возвращаемое методом значение мы анализируем, подобно тому, как это делали в предыдущем примере. Только здесь мы покидаем цикл при любой ошибке, отличной от ошибки, связанной с потерей поверхности, или при отсутствии ошибок.

Протестируйте пример. Приложение должно функционировать надежно в самых различных ситуациях, но если по ходу его работы изменить настрой­ки экрана и установить его новые размеры больше предыдущих, то при вос­становлении приложения оно не будет закрывать весь экран, а размеры его станут такими же, как при первоначальном запуске. Заметна еще одна про­блема: если до запуска приложения установить режим экрана в 256 цветов, образ выводится совсем не красочным. Чтобы избежать таких ошибок, обычно полноэкранные приложения устанавливают разрешения экрана со­образно со своими нуждами.

Код обработчика OnCreate формы дополнился строками:

hRet := FDD.SetDisplayMode (640, 480, 16, 0, 0); // Задаем режим

if hRet О DD_OK then begin   // Обязательно анализируем результат

ErrorOut(hRet, 'SetDisplayMode');

Exit; end;

Установка режима является методом главного объекта, поэтому должна про­исходить строго после его создания, но не обязательно первым же действи-:м. Первые три аргумента метода, надеюсь, сразу же ясны: высота, ширина экрана и разрешение (число бит, необходимых для определения цвета пиксела). Последние два аргумента метода всегда будем задавать нулевыми. первый из них определяет частоту регенерации. При нулевом значении параметра отдается на усмотрение DirectDraw. Последний аргумент задает дополнительные флаги, пока из них доступен только ddsdm_standardvgamode, связанный с особым режимом Mode X (320x200x8).

Итак, на время работы приложения мы задаем режим 640x480x16. Эта тройка чисел не может браться наобум, а должна принадлежать набору поддерживаемых системой режимов.

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

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

Раздел private описания класса формы дополнился строкой объявления до­полнительной поверхности, предназначенной для хранения образа:

FDDSImage     :      IDirectDrawSurface7;

Код обработчика события OnCreate начинается с того, что этой переменной присваивается значение nil, а при завершении работы приложения освобо­ждается память в порядке, обратном связыванию переменных:

if Assigned(FDD) then begin

if Assigned(FDDSImage) then FDDSImage := nil;     // Перед первичной if Assigned(FDDSPrimary) then FDDSPrimary := nil; // поверхностью FDD := nil; end;

Растровое изображение считывается только один раз. У обработчика OnCreate появился вспомогательный объект wrkBitmap класса TBitmap. Вто­ричная поверхность создается после первичной и заполняется считанным растром:

wrkBitmap := TBitmap.Create;   // Создание объекта растра

wrkBitmap.LoadFromFile ('..\lake.bmp'); // Считывание файла растра

// Напоминаю, что обнулять поля можно и с помощью

ZeroMemory FillChar (ddsd, SizeOf(ddsd), 0);

with ddsd do begin // Как для любой записи, можно использовать with

   dwSize := SizeOf(ddsd); // Обязательное действие

   // Будем задавать размеры поверхности (+ DDSD_HEIGHT и DDSD_WIDTH)

   dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;

   ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN; // Внеэкранная поверхность

   dwWidth  := wrkBitmap.Width;  // Ширина поверхности равна ширине растра

   dwHeight := wrkBitmap.Height; // Задаем высоту поверхности end;     // with

// Собственно создание вспомогательной поверхности

hRet := FDD.CreateSurfасе(ddsd, FDDSImage, nil);

if hRet <> DD_OK then begin  // Анализируем на предмет успешности

  ErrorOut(hRet, 'Create Image Surface');

  Exit;

end;

// Копирование растра из wrkBitmap во вспомогательную поверхность

hRet := DDCopyBitmap (FDDSImage, wrkBitmap.Handle, 0, 0, wrkBitmap.Width,

wrkBitmap.Height);

if hRet <> DD_OK then begin  // Обязательно анализируем результат

  ErrorOut(hRet, 'DDCopyBitmap');

  Exit;

end;

// Удаление вспомогательного объекта

wrkBitmap.Free;

 

Вспомогательная, внеэкранная поверхность FDDSImage создается с описанием ddscaps_offscreenplain. Здесь есть некоторые нюансы, но пока рассматривать их не будем.

После создания вторичной поверхности заполняем ее растровым изображе­нием с помощью вспомогательной функции DDCopyBitmap из модуля DDUtil,

не забываем дописать имя модуля после uses. В тонкости того, как осущест­вляется копирование, можете не вникать или разберитесь позднее самостоя­тельно. Код данной функции основан на функциях API. Ключевым является вызов StretchBlt.

< Часть 1 | Часть 2 | Часть 3 >

 

. : навигация : .

главная
DirectX
уроки
словарь
гостевая книга
о проекте
 
.: DirectX :.
введение
уроки
файлы
 

статистика

RAMBLER'S TOP100

Если вы используете материалы с данного сайта, то сообщите владельцу по почте
и вставьте ссылку на этот сайт "seprize.narod.ru"
seprize@narod.ru

© Сайт открылся 04.09.2002     Дата последнего обновления 09.10.2002

Сайт управляется системой uCoz