Подводная
лодка и подводный мир
В
данном уроке построенном в форме упражнений Вы попробуете разобраться
в том как |
|
|
-
имитировать подводную сцену при помощи тумана;
-
использовать вершинные шейдеры для имитации бликов от воды на поверхности
морского дна и подводной лодки; |
|
Для
изучения методик Вам потребуется скачать: -
архив с общим кодом -
Скачиваний : 2
(если
Вы его еще не скачали в предыдущем уроке)
-
исходный
код данного примера (32 Кб)
Скачиваний : 1
-
медиа-файлы
(модели, текстуры, шейдеры) - (676 Кб)
Скачиваний : 0
|
|
Краткое
описание приложения: данное приложение
предсталяет WinAPI-приложение для использования библиотеки DirectX
8.1. Для обращения к функциям библиотеки d3dx8.lib используется
ее dll-аналог - D3DX81ab.dll
Файл
DXErr81ab.dll представляет дополнительную библиотеку для вывода
сообщений об ошибках приложения.
Поскольку
Ваше приложение будет обращаться к этим библиотекам, необходимо
разместить эти файлы в той же папке, что и исполнимый файл (*.exe)
Вашего DirectX-приложения на Delphi. |
|
Краткий
обзор исходного кода модуля Main.pas:
класс
приложения CSubmarineD3DApp производится
от CD3DApplication (префикс типа C
вместо T - как принято в Delphi - дань традициям заложенным в исходном
коде на C++).
В
конструкторе constructor
CSubmarineD3DApp.Create; инициализируются
все основные поля класса приложения, здесь же устанавливается цвет
тумана - m_dwFogColor := D3DCOLOR_ARGB(255,
58, 180, 197); |
|
Инициализация
самого класса CD3DApplication происходит
в коде модуля проекта - submarine.dpr путём
вызова метода d3dApp.Create_ |
|
Т.к.
класс CD3DApplication описан в модуле
D3DApp8.pas, то заглянув в метод function
CD3DApplication.Create_ Вы и узнаете какие методы вызываются
во время инициализации вашего D3D-приложения:
{...
здесь мы опускаем код, необходимый для инициализации Direct3D8,
построения списка устройств и создания окна приложения}
//
запускается DX-Timer - для организации вызовов периодических процессов
D3D-приложения - это основной движущий процесс любого DirectX-приложения!
DXUtil_Timer(TIMER_START);
//
первоначальная инициализация сцены Вашего 3D-приложения
OneTimeSceneInit;
//
все остальные необходимые инициализации: InitDeviceObjects, RestoreDeviceObjects,
InvalidateDeviceObjects,
DeleteDeviceObjects. Также обратите внимание на англоязычные комментарии
(Если знаете английский :))
Initialize3DEnvironment; |
|
Теперь
Вам должно быть понятно откуда вызываются основные методы нашего
приложения (InitDeviceObjects, RestoreDeviceObjects, InvalidateDeviceObjects,
DeleteDeviceObjects).
Методы Render для отрисовки статичных
объектов сцены и метод FrameMove для
анимированных объектов вызываются в методе function
CD3DApplication.Render3DEnvironment. Этот метод в свою очередь
вызывается из function CD3DApplication.Run.
function
CD3DApplication.Run вызывается в модуле проекта - submarine.dpr
путём
вызова d3dApp.Run |
|
Обработка
сообщений системы (а не событий в классе TForm!!!) производится в
методе function CSubmarineD3DApp.MsgProc.
Почему? Вспомните - наше приложение WinAPI, т.е. без использования
VCL. Именно поэтому! |
|
Интерес
представляет также содержимое метода d3dApp.Run,
заглянув в который Вы увидите
...
//
Render a frame during idle time (no messages are waiting)
if (m_bActive and m_bReady) then
begin
if FAILED(Render3DEnvironment) then
SendMessage(m_hWnd, WM_CLOSE, 0, 0);
end;
т.е.
метод Render3DEnvironment
вызывается
во время отсутствия активности пользователя и других сообщений системы. |
|
Это
был краткий обзор примера. |
|
[статьи] [как
создать игру ну, погоди!] [к содержанию] |
|
|
|
|