Программирование 3D-игр в DirectX на Delphi
 
         
    [Главная] [Новости] [Статьи] [Игры] [Проекты] [Автор]  
         
  Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр.  
     
 
Вывод 2D-спрайтов в 3D-сцене и указателя мыши
 
     
  Продолжаем серию уроков, посвященных разработке Delphi DirectX игры. В данном уроке показано как вывести 2D-спрайт на поверхность 3D-сцены. Дополнительно показан один из способов "затухания" экрана для эффектного вывода фирменной заставки. Кроме того, показана реализация вывода курсора мыши аппаратными средствами графического адаптера.  
     
  [Все уроки]  
     
  Урок построен в форме упражнений. В упражнениях даются примеры модификаций исходного кода и краткое описание того, что при этом наблюдается и как это объясняется. Выполняя упражнения Вы лучше вникнете в суть проблемы.  
       
 

ПОСТАНОВКА ЗАДАЧИ: Требуется организовать вывод 2D-спрайтов в 3-х мерной сцене. Под 2D-спрайтами имеются в виду анимированные или статичные 2D-изображения.

 

В чём суть проблемы? При использовании класса TD3DImage2D реализующем вывод 2D-изображений по принципам класса CD3DFont из модуля D3DFont.pas объекты привязаны к плоскости экрана. Если потребуется изменение положения в пространстве, то это будет возможно только изменением Z-порядка отрисовки.

Поэтому встала задача разработки класса для вывода 2D-изображений альтернативным способом.

 
     
 

Особенности урока:

- показан альтернативный способ вывода 2D-изображений по технологии 2D-спрайтов (из примера игры Donuts3D).

- показано как разработать новый класс для расширения возможностей Delphi DirectX 8.1.

- реализация вывода указателя мыши аппаратными средствами.

 
     
 

Для выполнения упражнений Вам понадобится:

- архив с исходным кодом; (1,19 Мб)

- архив с ОБЩИМ КОДОМ; (772 Кб)

Архив с исходным кодом содержит пример решения поставленной задачи и все необходимые медиа-файлы (модели, текстуры, шейдеры и т.д.), архив с общим кодом - содержит дополнительный общий код необходимый при разработке всех Delphi DirectX 8.1 - приложений.  
     
 

Для начала откомпилируйте пример и запустите приложение. Убедитесь, что всё работает. (Если нет, то читайте файлы readme.txt приложенные к архивам)

 
     
 

Нормально работающий пример (см. файл pmk.exe внутри архива Other2D.rar) должен давать следующий результат: создание нормального Windows-окна, постепенное проявление на экране анимированной заставки, выдерживание ее некоторое время, затухание, вывод некототорой 3D-сцены (3d-модель). Клавишами Вверх/Вниз можно перемещать камеру вызывая тем самым перемещение камеры. Выход из приложения - [Escape].

 
     
 

Рассмотрим содержание примера с исходным кодом (pmk.dpr).

Приложение построено на принципах стандартного WinAPI-приложения. Для лучшего уяснения того, что это такое обратитесь к предыдущим урокам. Хорошим стартом в понимании разработки Delphi DirectX - игр является также пример игры - Donuts3D.

 
     
  Класс приложения - TD3DGameApp. Название класса чисто условное и его легко изменить в своих приложениях. Если Вы заглянете в исходный код (файл Main.pas проекта pmk.dpr), то увидите что данный класс производится от TD3DAbstractApp. Основа данного класса приложения - из Donuts3D с небольшими изменениями.  
     
 

Лучше уяснить структуру и функционирование данного класса можно рассмотрев пример Donuts3D. В контексте данного урока важны следующие опорные моменты:

SpriteSplash: TD3DSprite;//внутри класса объявлено следующее поле

В методе TD3DGameApp.DrawScreenSplash помимо прочего вызывается метод -

SpriteSplash.Draw(0.0, -0.03, 0.9, DrawD3DSprite_Filtered, Alpha);

Это и есть вывод заставки на экран.

 
     
  Как видим, для вывода 2D-изображения в 3D-сцене используется класс TD3DSprite. Реализация этого класса находится в модуле D3DGUI.pas. Этот модуль и этот класс могут послужить Вам примером того, как разработать новые классы для выполнения необходимых действий по подготовке игрового процесса. Ссылка на D3DGUI добавлена в uses модуля Main.pas  
     
  Обратите внимание! Вывод 2D-изображения в 3D-сцене с использованием TD3DSprite обязательно требует использования камеры (CD3DCamera)! Забыв про это Вы будете ломать голову почему всё написано правильно, а 2D-изображения так и нет в сцене.  
     
 

Для лучшего уяснения функционирования примера типового D3D-WinAPI-приложения, обратитесь к схеме Структура функционирования типового DirectX-приложения, а также к исходному коду.

Внутри метода TD3DGameApp.Draw2DPictures показан способ вывода 2D-спрайта в 3D-сцене. Этот же код перенесен в метод Draw класса TD3DSprite.

 
     
  Расскажем теперь о правилах использования класса TD3Sprite (эти правила касаются использования любых Direct3D8-производных объектов сцены - т.е. всего того, что будет отрисовываться на экране через D3D или помогать этому процессу - моделей, текстур, эффектов (шейдеры) и т.п.).  
     
 

- внутри класса приложения или в виде отдельной переменной объявить поле с данным типом -

SomeSprite: TD3DSprite;

- в методе создания приложения создать экземпляр класса


SomeSprite := TD3DSprite.Create(TextureFormat); // TextureFormat = формат
// изображения, например
// D3DFMT_A8R8G8B8


- в методе инициализации 3D-сцены приложения (InitDeviceObjects, CreateDeviceObjects)
вызвать метод инициализации экземпляра класса


SomeSprite.InitDeviceObjects(pd3dDevice, TextureFilename);
// TextureFilename - путь и имя файла текстуры изображения

- в методе RestoreDeviceObjects приложения вызвать метод


SomeSprite.RestoreDeviceObjects(m_Camera);

//m_Camera - класс CD3DCamera - камера используемая в данном приложении

- в методе InvalidateDeviceObjects приложения

SomeSprite.InvalidateDeviceObjects;

- в методе DestroyDeviceObjects приложения
SAFE_DELETE(SomeSprite);

- в методе FrameMove приложения произвести анимацию (как? - показано в исходном коде);

- в методе Render приложения произвести отрисовку (см. TD3DGameApp.DrawScreenSplash);

============================================================

Для задания ключевого (прозрачного) цвета служит свойство
ColorKey (read/write)

SomeSprite.ColorKey := $00000000;

Для хранения имени и пути загруженного файла текстуры свойство-
TexFilename (read only)

SomeFilename := SomeSprite.TexFilename;

свойство SomeSprite.fSize задает размер спрайта в 3D-сцене.


В методах отрисовки 3D-сцены приложения используются методы отрисовки 2D-изображения в 3D-сцене

SomeSprite.Draw(x, y, z, Flags, Alpha);Some2DImage.Draw(x, y, Flags, Alpha);Some2DImage.Draw(x, y, Flags, Alpha);
// x, y, z - координаты в координатном пространстве Viewport (-1..1); Flags - дополнительные
// опции отрисовки (DrawD3DSprite_Filtered - задает линейную фильтрацию при выводе)
// Alpha (0..255) - полупрозрачность изображения - от прозрачного (0) до
// полностью непрозрачного (255).

метод DrawScale позволяет выводить прямоугольные спрайты.

Реализация других особенностей показана в исходном коде примера.

 
     
  Чтобы лучше уяснить себе использование данного класса настоятельно рекомендуется поэкспериментировать с исходным кодом!  
     
 

В методе TD3DGameApp.DrawScreenSplash происходит вывод заставки -

Реализация вывода подобна особенностям описанным в уроке Вывод Заставки с тем лишь отличием, что используется другой класс (вместо TD3DImage2D его аналог TD3DSprite). Кроме того, возможности класса TD3DSprite были расширены для того, чтобы использовать анимацию. Это и показано в исходном коде.

Для анимации также были добавлены новые вызовы внутри функции TD3DGameApp.FrameMove

Шагающий человечек - это 2D-спрайт. Его особенности реализованы в объекте GoingMan.

Замечание: после внесения изменений в код не забывайте перекомпилировать приложение, а уж после запускать и смотреть что получилось!

 
     
 

Комментарии к реализации плавного затухания заставки Вы найдете в уроке Вывод Заставки.

Аппаратный указатель мыши реализован следующим образом:

1) изображение курсора должно быть в формате *.ICO;

2) установка свойств отображаемого курсора происходит внутри метода TD3DGameApp.MsgProc - слегка видоизменен обработчик события WM_ACTIVATEAPP; внутри обработчика события WM_SETCURSOR происходит установка вида курсора.

Из-за ограничений формата ICO (поддержка лишь 16 цветов) невозможно вывести полноцветный курсор. Однако можно подавить вывод аппаратного курсора и производить вывод указателя программным способом как это показано в уроке Создание игрового меню.

 
     
  Для лучшего уяснения данного материала нужно обязательно написать собственное приложение и тщательно проработать все показанные особенности.  
     
 

Данный урок носит скорее вид заметок нежели исчерпывающие описания. Однако все ответы ищите в исходном коде! Основной целью было показать альтернативный способ вывода 2D-спрайтов и сообщить что развитие проекта Нечто: Необъяснимое продолжается.

Реализация меню с использованием классов TD3DImage2D и TD3DSprite и другие особенности реализации игрового проекта будут показаны в следующих уроках. Следите за новостями проекта!

 
     
 

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

- архив с исходным кодом; (1,27 Мб)

Данный пример содержит указатель мыши сочетающий достоинства аппаратного курсора и возможности программной реализации его возможностей (т.к. курсор выводится как объект класса TD3DImage2D для него можно использовать размер более 32х32, количество цветов как в текстуре, а не как у системной иконки и анимацию любой сложности! с учетом ее реализации в классе TD3DImage2D как в классе TD3DSprite).

улучшенный курсор мыши
 
     
  [Назад] [Все уроки]  
     
    [Главная] [Новости] [Статьи] [Игры]    
         
(c) Мега Информатик 2006-2007    
Hosted by uCoz