Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

Ну что же, после такого вступления можно переходить к рассмотрению первого примера, проекта каталога Ex01. Выглядит его работа несложной: по экрану времени перемещаются образы логотипа DirectX, отскакивая от стенок. Пример является моей трансляцией одного из примеров, входящих в DirectX 8.0 SDK, я внес в код минимум изменений по сравнению с первоисточником.

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

В коде отсутствуют многие знакомые нам типы, вместо них появились новые:

g_pDisplay : CDisplay; // Главный объект

g_J?LogoSurface : CSurface; // Поверхность образа

g_pTextSurface : CSurface; // Поверхность текста

Я долго думал, изменять ли префикс таких типов на префикс "т", принятый для Delphi, и решил оставить все-таки его таким же, как и в первоисточнике.

лавный объект инкапсулирует методы и свойства, связанные с созданием и управлением поверхностями. Объекты присоединяемых к главному объекту поверхностей можно создавать пустыми, либо по содержимому растра, либо путем вывода текста:

g_pDisplay := CDisplay.Create; . // Создание главного объекта

// Метод создания полноэкранного дисплея

hr := g_pDisplay.CreateFullScreenDisplay(Handle, ScreenWidth,

ScreenHeight, ScreenBitDepth);

// Анализ успешности действия

if FAILED(hr) then ErrorOut (hr, 'This display card does

not support 640x480x8.');

// Создание внеэкранной поверхности спрайта

hr := g_pDisplay.CreateSurfaceFromBitmap(g_pLogoSurface, imageBmp,

SPRITE_DIAMETER, SPRITEJDIAMETER);

if(FAILED(hr)) then ErrorOut (hr, 'CreateSurfaceFromBitmap');

// Создание внеэкранной поверхности с текстом

hr := g_pDisplay.CreateSurfaceFromText(g_pTextSurface, Font.Handle,

HELPTEXT, RGB(0,0,0>, RGB(255, 255, 0));

if(FAILED(hr)) then ErrorOut (hr, 'CreateSurfaceFromText');

// Метод поверхности для установки цветового ключа

hr := g_pLogoSurface.SetColorKey(0);

// Ключ - черный цвет

if(FAILED(hr)) then ErrorOut (hr, 'SetColorKey');

Как я и обещал, код действительно упростился, нет ни слова о первичной поверхности и вообще о буферах. Вся эта черновая работа скрыта от глаз разработчика. Воспроизведение также значительно упростилось. Основано оно целиком на использовании методов главного объекта:

for iSprite := 0 to NUM_SPRITES - 1 do // Цикл вывода спрайтов

g_pDisplay.ColorKeyBlt(g_Sprite[iSprite].fPosX,

g_Sprite[iSprite].fPosY, g_pLogoSurface.GetDDrawSurface, nil);

// Вывод текста подсказки

g_pDisplay.Blt(10, 10, g_pTextSurface, nil);

// Завершение работы. Выполняем переключение поверхностей

Result := g_pDisplay.Present;

Выглядит код немного непривычно, но радует своей лаконичностью. Надеюсь, вы сейчас испытываете светлое чувство ясности понимания того, что скрыто за этой краткостью кода.

Самостоятельно разберите, как выглядит код восстановления потерянных поверхностей.

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

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

Используется палитровый режим, поэтому добавилась переменная знакомого нам типа IDIRECTDRAWPALETTE. Для загрузки ее задействованы соответствующие методы главного объекта:

// Загружаем палитру из растра

hr := g_pDisplay.CreatePaletteFromBitmap(g_pDDPal, imageBmp);

if FAILED(hr) then ErrorOut (hr, 'CreatePaletteFromBitmap');

// Задаем палитру для экрана

hr := g_pDisplay.SetPalette(g_pDDPal);

if FAILED(hr) then ErrorOut (hr, 'SetPalette');

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

  • Читать дальше
  • 1
  • ...
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: