Программирование 3D-игр в DirectX на Delphi
 
         
    [Главная] [Новости] [Статьи] [Игры] [Проекты] [Автор]  
         
    [Архив новостей]    
         
  [Форум] на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы  
         
  Основы 3D-программирования DirectX9 в Delphi 2006: теоретические и практические основы создания игр.  
     
     
Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...]
 
[Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]
[Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX]
 
Что такое Delphi DirectX ?
     
  [назад] [далее] [к содержанию]  
     
  16/05/2009  
     
  Перейдем к изучению кода примера MultiAnimation в среде Delphi DirectX 9  
     
 

Сразу же хочу заметить, что пример MultiAnimation является новым для DirectX SDK 9. В DX SDK 8.1 такой пример отсутствовал.

Но это Вас нисколько не должно пугать, наоборот - можно только порадоваться тому, что работа с анимацией 3D-персонажей была выведена на новый, более качественный уровень.

Теперь не потребуется писать специальные приложения для экспорта анимации из 3ds max, кроме того, сама работа с анимированной моделью проходит более эффективно.

Итак, будем полагать, что всё у нас получится и мы действительно сможем выполнить всё задуманное.

 
     
 

Если Вы только начинаете изучать DirectX (на С++ или на Delphi - неважно, т.к. проблемы будут одни и те же), то пример MultiAnimation сразу после уроков из Tutorials может показаться Вам несколько сложноватым.

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

Но не торопитесь с выводами. Пример конечно трудный для начала, но последовательно осваивая его и не отступая перед трудностями Вы реализуете главное, что является основой любой современной компьютерной игры: работа с анимированными 3d-моделями. Причем сделать это надо будет на уровне моделирования в 3ds max, затем разобраться с особенностями экспорта (если Вы еще до конца не разобрались с ними) и после этого переходить к написанию кода для работы с анимированными моделями.

Ну а уж после того, как Вы преодолеете указанные трудности, всё остальное Вам покажется уже гораздо более ясным.

 
     
 

MultiAnimationUnit.pas

Начинается всё как обычно - основой приложения является класс CD3DApplication использующий интерфейсы DirectX9, от него производится класс CMyD3DApplication, в котором описываются

меш для пола

матрица для пола

материал и

текстура для пола

шрифт

камера

соотношение длины и ширины рабочей области окна d3d-приложения (m_fAspectRatio)

звук

объект для работы с анимированной моделью, содержащей набор анимаций

список персонажей в сцене

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

 
     
 

Замечу, что пример MultiAnimation - множественная анимация назван так по причине демонстрации использования множества наборов анимаций для 3d-модели, а не потому что таких моделей в сцене будет показано много. Это лишь хорошее дополнение к описанию первой возможности.

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

 
     
 

constructor CMyD3DApplication.Create;

Содержит начальную инициализацию всех используемых объектов - классы создаются, переменные инициализируются.

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

метод function CMyD3DApplication.ConfirmDevice

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

Может быть и такая ситуация, что всё это есть, но пример увы не работает. Самая распространенная причина - Windows недавно переустанавливали, а вот драйвера для видеокарты установить забыли, а те, что ставятся по-умолчанию, естественно не дают нужного результата. Это и приводит к ошибке.

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

 
     
 

Если Вам не совсем ясно в каком направлении и последовательности происходит работа примера MultiAnimation откройте файл проекта MultiAnimation.bdsproj и сами всё увидите

Сначала Create, затем AppCreate, потом уже Run, а в конце Free

Именно внутри реализации данных методов и нужно искать ответ на данный вопрос

Они уведут Вас в глубь модуля D3DApp.pas, но там Вы воочию увидите чем же таким особенным отличается DirectX 9 от DirectX 8.1, т. е. что нужно учитывать при портировании существующих приложений ориентированных на DirectX 8.1 при переходе на DX 9

 
     
 

Из всего, что есть внутри метода function CD3DApplication.AppCreate

для нас интерес пока будет представлять лишь вызов OneTimeSceneInit и Initialize3DEnvironment > InitDeviceObjects, которые реализованы в модуле MultiAnimationUnit.pas

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

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

 
     
  Напомним общую структуру функционирования типового DirectX-приложения  
     
   
     
 

В примере MultiAnimation роль метода WinMain выполняют логические скобки begin...end. в модуле MultiAnimation.bdsproj

Create > AppCreate > Run > Free

Т. е. на схеме Create_ заменяется на AppCreate (Create вызывается до него внутри WinMain), далее внутри метода Initialize3DEnvironment вызываемого внутри AppCreate после OneTimeSceneInit вызываются все необходимые методы для создания необходимых объектов и загрузки ресурсов (т. е. что-то аналогичное цепочке CreateInputObjects, CreateSoundObjects, CreateDisplayObjects и т.д.)

Всё остальное - подобно тому, что представлено на схеме

Данная схема взята из урока посвященного описанию полноценного примера игры Donuts3D для Delphi DirectX 8.1. Познакомившись с особенностями работы в Delphi DirectX 9 Вы легко сможете портировать данный пример на новую платформу (у меня еще пока руки не дошли). После этого Вы получите в своё распоряжение полноценную основу для создания будущей 2D или 3D-игры. Все исходники прилагаются.

 
     
  Итак, теперь Вам должна быть ясна общая картина работы примера MultiAnimation, а это значит, что пришла пора перейти к описанию непосредственно тех особенностей, которые касаются использования анимированных 3d-моделей с несколькими наборами анимаций.  
     
 

function CMyD3DApplication.InitDeviceObjects

// set up MultiAnim
//Result := DXUtil_FindMediaFileCch(sXFile, MAX_PATH, 'tiny_4anim.x');
//замена для использования другой модели
Result := DXUtil_FindMediaFileCch(sXFile, MAX_PATH, 'Media\Models\roboo.x');
//проверяем наличие требуемых ресурсов: модели и шейдера (файла эффекта fx)
if FAILED(Result) then Exit;
Result := DXUtil_FindMediaFileCch( sFXFile, MAX_PATH, 'MultiAnimation.fx');
if FAILED(Result) then Exit;

AH:= CMultiAnimAllocateHierarchy.Create; //объект для загрузки иерархии элементов внутри файла анимированной модели
try
AH.SetMA(m_MultiAnim);
//задаем объект, в который будет происходить загрузка элементов анимированной модели

Result := m_MultiAnim.Setup(m_pd3dDevice, sXFile, sFXFile, AH); //загружаем модель и файл эффекта (fx)
if FAILED(Result) then Exit;

// get device caps
m_pd3dDevice.GetDeviceCaps(caps);
//производим сверку версии шейдера с имеющейся в системе

// Select the technique that fits the shader version.
// We could have used ValidateTechnique()/GetNextValidTechniqe() to find the
// best one, but this is convenient for our purposes.
if (caps.VertexShaderVersion <= D3DVS_VERSION(1,1)) then
begin
if (caps.VertexShaderVersion < D3DVS_VERSION(1,1)) then
begin
m_MultiAnim.SetTechnique('t2');
m_MultiAnim.SetSWVP(True);
end else
begin
m_MultiAnim.SetTechnique('t1');
m_MultiAnim.SetSWVP(False);
end;
end else
begin
m_MultiAnim.SetTechnique('t0');
m_MultiAnim.SetSWVP(False);
end;

// Restore steps for tiny instances //вызов метода Restore для всех персонажей игровой сцены
for i:= 0 to m_v_pCharacters.Count - 1 do
begin
m_v_pCharacters[i].RestoreDeviceObjects(m_pd3dDevice);
end;

// If there is no instance, make sure we have at least one. //если персонажей 0 создаем хотя бы одного
if (m_v_pCharacters.Count = 0) then
begin
try
pTiny := CTiny.Create;
except
Result:= E_OUTOFMEMORY;
Exit;
end;

Result := pTiny.Setup(m_MultiAnim, m_v_pCharacters, m_DSound, 0.0); //подготовка персонажа к старту анимации
end;
finally
AH.Free;
//освобождение объекта работы с иерархией элементов анимированной модели
end;

 
     
 

В заключение Вам остается рассмотреть реализацию методов FrameMove и Render

В методе FrameMove анимируются персонажи и обновляется положение камеры, а внутри Render происходит собственно процесс отрисовки игровой сцены и персонажей.

Более подробно об этом мы поговорим на следующей страничке данного урока

 
     
     
  [назад] [далее] [к содержанию]  
       
 

Обновления и новости о развитии Delphi DirectX проекта
смотри на сайтах:

http://www.megainformaticsite.pochta.ru

http://www.megainformatic.boom.ru

http://www.megainformatic.narod.ru

 

   
       
     
 

по всем вопросам пишите на megainformatic@mail.ru или оставьте сообщение на форуме

 
     
   Обмен ссылками  
     
     
             
 
 
         
(с) МЕГА ИНФОРМАТИК 2006-2009

 

Hosted by uCoz