ria pc game
translate to English   translate to Chinese
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
22 марта 2019 11:23
Вход Регистрация Забыли пароль ?

megainformatic - Использование checkbox
        Другие уроки можно посмотреть в разделе Статьи  
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - статьи Тимонина Андрея - Flash. Содержание

megainformatic - статья Тимонина Андрея - Flash. Подготовка к работе.

megainformatic - статья Тимонина Андрея - Flash. Hello world.

megainformatic - статья Тимонина Андрея - Flash. Экспорт SWC библиотеки.

megainformatic - Тимонин Андрей - Несколько слов о себе

megainformatic - статьи Тимонина Андрея - уроки из области веб программирования, создания казуальных игр

megainformatic - статья Тимонина Андрея - Обеспечиваем доступ к объекту из любой точки программы. Singleton

megainformatic - статья Тимонина Андрея - Хронология работы программы. Создаем Лог

megainformatic - статья Тимонина Андрея - Поиск файлов. Получаем список файлов каталога.

megainformatic - статья Тимонина Андрея - Исключения. Создаем класс обработки исключений.

megainformatic - статья Тимонина Андрея - States. Создаем менеджер состояний игры.

megainformatic - статья Тимонина Андрея - Регистрация. Часть 1. Создаем страничку регистрации на сайте.

megainformatic - статья Тимонина Андрея - Регистрация. Часть 2. Создаем обработчик, и заносим информацию о пользователе в Б.Д.

megainformatic - статья Тимонина Андрея - Таймер. Выводим время игры.

megainformatic - статья Тимонина Андрея - DirectX9. Создаем основной класс обработки графики.

megainformatic - статья Тимонина Андрея - DirectX9. Создаем первое приложение.

megainformatic - Что нужно знать для создания сайта ? float - использование в css - стилях

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 2 - пишем свою композицию COLD

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 3 - экспериментируем с композицией COLD

megainformatic - Что нужно знать для создания сайта ? Стандартные шрифты для сайта

megainformatic - Что нужно знать для создания сайта ? ASC II Коды символов

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 4 - пишем первый вариант композиции COLD

megainformatic - Популяризация Современных Научных Знаний и Размышления на околонаучные темы. СОДЕРЖАНИЕ

megainformatic - Популяризация Современных Научных Знаний и Размышления на околонаучные темы. Энергетический кокон

megainformatic - Модуль галерей для любой cms

megainformatic - Портфолио выполненных проектов сайтов и приложений

megainformatic - Мои Музыкальные Миры - страница 2

megainformatic - megainformatic cms rs

megainformatic - модуль Падающий снег

megainformatic - проект Open Shop

megainformatic - Рисуем красивую девушку всего за 6 шагов

megainformatic - Галерея красивых рисованных девушек

megainformatic - НОВОГОДНЕЕ ОБРАЩЕНИЕ СОЗДАТЕЛЯ webinformatic К ЖИТЕЛЯМ ПЛАНЕТЫ интернет

megainformatic - Отзывы оставленные пользователями как впечатление о проделанной работе или что-либо понравившееся на сайте

megainformatic - Уроки css - атрибут position

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - СОДЕРЖАНИЕ

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - Глава 1 - Обычный день

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - Глава 2 - Начало (begin)

Новогодняя дискотека 2013 на megainformatic точка ru

megainformatic - Программируем на C++ с использованием MFC

megainformatic - Программируем на C++ с использованием MFC - Создание MFC приложения

megainformatic - Программируем на C++ с использованием MFC - Создание MFC приложения - hello, world !

megainformatic - Как создать игру ? - Пишем игровой движок с нуля

megainformatic - Как создать игру ? - Пишем игровой движок с нуля - Вступление

megainformatic - Как создать игру ? - Пишем игровой движок с нуля - Общая структура будущего игрового движка

Разное

megainformatic - Как создать игру ? - Пишем игровой движок с нуля - DXUTMainLoop - цикл работы DirectX-приложения

megainformatic - Варианты макетов Психолог 911

megainformatic - Шаблоны для сайтов - что это и какие они бывают ?

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - Глава 3 - Кто он ? (who is ?)

megainformatic - Мои Музыкальные Миры - готовая музыка mp3 - новинки 2013 года

megainformatic - Теория и практика хакерских атак - самозащита от нападения

megainformatic - Теория и практика хакерских атак - самозащита от нападения - Способы подмены реального IP

megainformatic - Fruity Loops Studio 9 - Как синтезировать свои сэмплы - изучаем возможности плагина Sytrus

megainformatic - Видоизменяем тему для Wordpress под свои нужды

megainformatic - Flash приложения и игры - Шаг 3 - управляемый шарик

подробнее

     
 

Видео урок посвященный созданию игры на примере игры Ну, Погоди ! - рождение игры часть 2.

Элементарные и простые игры на примере которых можно в delphi 7 на directx 8.1 api научиться создавать игры.

 
     
 
Урок 4 Построение класса приложения
 
О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1
 
Далее у читателя подразумевается наличие базовых знаний языка Delphi.
 
[назад] [страница 1] [далее] [к содержанию]
 
Из предыдущих уроков вы уже почерпнули некоторую информацию о том, как строится и функционирует типичное D3D-приложение. Эта информация является общей для всех приложений DirectX написанных как на C++, так и на Delphi. Разница лишь связана с синтаксическими особенностями данных языков программирования и средами программирования в которых происходит работа.
 
Здесь и далее мы познакомимся с основными особенностями Direct3D-приложения, которые необходимо учитывать при разработке его базового класса.
 
За основу мы возьмем класс CD3DApplication, рассмотрим и протестируем на конкретных примерах его особенности, а далее покажем класс, который используется в игре "Ну, Погоди!" и проведем небольшое сравнение.
 
С исходным кодом класса CD3DApplication вы можете познакомиться заглянув в модуль D3DApp.pas из папки common библиотеки delphi directx 8.1
 
Данный класс является абстрактным (также как и например TForm), поэтому нужно сначала создать производный класс от данного, а затем уже работать с новым созданным классом, используя его для своих целей, что и происходит во всех примерах из DirectX SDK.
 

CD3DApplication производится напрямую от TObject.

Основное назначение класса - обеспечение работы WinAPI-приложения с использованием также DirectX API, другими словами данный класс предоставляет удобный для работы интерфейс для вызова необходимых приложению интерфейсов Windows и главным образом интерфейсов DirectX.

 

Основные методы этого класса - это

Create

Destroy

Create_

Run

MsgProc

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

OneTimeSceneInit

InitDeviceObjects

RestoreDeviceObjects

FrameMove

Render

InvalidateDeviceObjects

DeleteDeviceObjects

FinalCleanup

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

 
В качестве основы для изучения данного класса и экспериментов с ним мы возьмем пример SwitchScreenModes
[downloads:12] из предыдущего урока. Для экспериментов над кодом класса CD3DApplication советую Вам взять файл D3DApp.pas и его копию разместить внутри папки того проекта в котором Вы будете проводить эксперименты. При этом среда Delphi будет использовать локальную копию вместо копии из папки common, а Вы сможете проводить какие угодно изменения не вмешиваясь в оригинальный код D3DApp.pas
 
Класс приложения CD3DApplication функционирует абсолютно по тем же правилам, которые мы рассмотрели в предыдущих уроках.
 

Метод Create задает начальные значения для множества полей данного класса,

в частности запоминается ссылка на самого себя -

g_pD3DApp := Self;

задаются начальные размеры окна приложения

m_dwCreationWidth := 400;
m_dwCreationHeight := 300;

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

 
Данный метод - метод конструктора класса, вызывается при создании нового объекта данного класса и выполняет базовую начальную инициализацию заданных полей класса теми значениями, которые заданы в реализации данного конструктора, все остальные поля обнуляются или выставляются в nil (если это указатели)
 

Метод Destroy - метод деструктора класса, вызывается при удалении объекта класса. При этом освобождается память занятая объектом и связанными с ним ресурсами. Если таких ресурсов достаточно много и они занимают значительный объем, то выполнение метода может занимать значительное время - вспомните любую игру, в которую Вы играли в последний раз, почему игра по выходу из нее закрывается не сразу, а через некоторое время? Именно поэтому.

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

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

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

Метод Create_ - представляет метод начальной инициализации класса приложения. Его имя происходит от имени оригинального метода Create на C++. Но поскольку в языке Delphi для конструктора и деструктора применяются специальные имена (Create и Destroy), а в языке C++ имя конструктора и деструктора совпадает с именем класса, то данный метод и получил такое название. Знак подчеркивания обозначает, что данный метод именно метод инициализации, а не метод конструктора!

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

создается объект Direct3D, выполняется создание списка графических устройств, создается окно приложения (если требуется), задается стиль, границы окна и рабочей области, запускается DXTimer осуществляющий периодические процессы D3D-приложения - цикл подготовки кадра и цикл отрисовки, вызывается виртуальный метод OneTimeSceneInit осуществляющий однократную инициализацию, должен быть реализован в производном классе, поэтому его работа целиком зависит от того, как он будет реализован, наконец метод Initialize3DEnvironment выполняет окончательную инициализацию 3D-среды, главным образом создавая объект IDirect3DDevice8 на основе параметров, которые были получены на предыдущих этапах выполнения.

После этого приложение переходит в состояние готовности. Это означает, что начинаются периодические процессы, выполняющие циклическую работу:

метод Run - если приложение работает как WinAPI, то данный метод вызывается напрямую и будет запущен цикл проверки сообщений на основе которого и работает типичное WinAPI-приложение.

метод MsgProc - представляет реализацию оконной процедуры приложения, которая отвечает за обработку поступающих в неё сообщений от системы. Эти сообщения играют важную роль, т.к. при помощи них и происходит собственно работа приложения в системе Windows. При каких-либо событиях, например, нажатии пользователем клавиши или перемещении мыши система реагирует на них и создает соответствующие сообщения. Эти сообщения попадают в очередь сообщений и если предназначены конкретному приложению имеющему фокус, то система передает их ему. Помимо описанных в качестве сообщений могут быть любые другие - достаточно заглянуть в код метода MsgProc и вы увидите как обрабатывается приложением сообщение об активации/деактивации приложения, реакция на команду окна меню и т.д.

 
Оставшиеся методы - OneTimeSceneInit, InitDeviceObjects, RestoreDeviceObjects, FrameMove, Render, InvalidateDeviceObjects, DeleteDeviceObjects, FinalCleanup

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

 

Назначение метода OneTimeSceneInit состоит именно в однократном его вызове. Внутри данного метода можно создавать такие объекты, которые необходимо создать лишь однократно при начальном старте - объект DirectInput, некоторые общие ресурсы, которые будут использоваться на протяжении всего приложения.

InitDeviceObjects - в отличие от предыдущего метода может вызываться и не один раз, однако перед его вызовом необходимо вызывать DeleteDeviceObjects т.е. сначала удалить все используемые объекты, иначе это приведет к ошибкам.

Методы RestoreDeviceObjects и InvalidateDeviceObjects также работают в логической паре. После инвалидации объектов их обязательно нужно восстановить, перед восстановлением обязательно инвалидировать. Иначе это опять же приведет к ошибкам. В этих методах нуждаются объекты, зависимые от текущего устройства. Если вдруг произошел его сброс, то происходит инвалидация, после чего нужно обязательно выполнить восстановление. К таким объектам относятся модели, шейдеры.

 

Метод FrameMove - исходя из названия "движение кадра" - отвечает за подготовку следующего кадра анимации. Как таковая отрисовка в нем не происходит. Его основное назначение - это вызов метода UpdateInput который выполняет опрос устройств ввода клавиатуры и мыши, а также выполнение всех необходимых вычислений, которые осуществляют перемещение персонажей, логику игры и прочее

От сложности процессов, происходящих внутри данного метода напрямую будет зависеть производительность приложения, потому что данный метод в паре с методом Render периодически вызывается таймером DXTimer через минимальные интервалы времени, чем и определяется FPS - частота кадров.

Метод Render - не должен содержать слишком "тяжеловесного" кода, т.к. его основная задача - как можно быстрее отрисовать то, что было подготовлено на предыдущей стадии. Для ускорения работы данного метода выполняются различные подготовительные стадии, в частности, отсечение объектов, не попадающих в поле зрения камеры. Правильное выполнение этого процесса (естественно внутри FrameMove, а не внутри Render) гарантирует то, что игра "не будет тормозить" даже при кажущемся большом количестве игровых объектов присутствующих в игровой сцене. Они просто будут исключаться из цикла отрисовки, если не попадают в определенную область видимости.

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

Откроем пример SwitchScreenModes и копию модуля D3DApp.pas, которую Вы должны были скопировать из папки common в папку данного проекта

Открыть модуль D3DApp.pas достаточно просто - в коде модуля SwitchModesUnit.pas найдите имя D3DApp в списке uses и удерживая нажатой клавишу [Ctrl] щелкните по этому имени левой кнопкой мыши.

Модуль D3DApp.pas будет открыт для Вас. Чтобы удостовериться, что Вы действительно работаете с копией, а не с оригиналом из папки common, попробуйте выполнить сохранение. Если диалог укажет на папку проекта, а не на common, значит всё верно, можно смело приступать к экспериментам!

 

Для начала мы заглянем внутрь метода CD3DApplication.Create_ и выясним несколько фактов:

Как происходит построение списка адаптеров и какой видео режим выбирается по умолчанию - нам нужно будет поработать с кодом внутри BuildDeviceList

Какие особенности учитываются при реализации Initialize3DEnvironment для инициализации 3D-среды

 

Самый простой эксперимент - закомментируем кусок кода -

{hr:= BuildDeviceList;
if FAILED(hr) then
begin
SAFE_RELEASE(m_pD3D);
Result:= DisplayErrorMsg(hr, MSGERR_APPMUSTEXIT);
Exit;
end;}

заключив его в фигурные скобки, выполним компиляцию, запустим приложение и посмотрим что произошло.

Мы получим Generic application error и приложение будет закрыто. Даже ничего не зная о функционале работы CD3DApplication из этого можно заключить, что данный код является критичным для работы приложения.

Раскомментируем код и отправимся вглубь метода BuildDeviceList для экспериментов внутри него.

Замечу, что показанная техника экспериментов с комментированием участков кода для лучшего уяснения его назначения и работы уже рассматривалась в ряде статей, в частности в - Теория и практика 3D-игр

 

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

Посмотрим как происходит работа внутри данного метода в режиме отладки. Для этого достаточно установить в нужной строке кода контрольную точку останова и запустить приложение в режиме отладки.

 
 
Для этого щелкаем левой кнопкой мыши в указанной позиции и там появится красный кружок вместо синего (как на рисунке).
 
 
Запускаем приложение в режиме отладки кнопкой Run как показано на рисунке.
 

Для пошагового исполнения кода используем клавишу [F8]. Для входа в код вызываемых процедур и функций можно использовать [F7].

Параллельно можно исследовать содержимое переменных наблюдая как изменяются их значения.

Сначала мы наблюдаем как выбираются все видео- режимы чьё разрешение >= 640x480

Отфильтровываются все подобные видеорежимы, отличающиеся лишь частотой покадровой развертки.

Заносятся в список только имеющие уникальный формат текстуры, отсортировываются в порядке увеличения разрешения и качества формата текстур.

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

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

 

Какой режим выставляется по умолчанию?

Все видеорежимы попадают в поля структуры m_Adapters представляющей список адаптеров в системе. Каждый адаптер в свою очередь имеет список устройств, список видеорежимов, форматов и т.д.

В конце данного метода выставляется текущий адаптер и устройство -

m_Adapters[a].dwCurrentDevice := d;
m_dwAdapter := a;
m_bWindowed := True;

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

Для полного ответа на поставленный вопрос в методе Create_ попробуйте сразу после выполнения BuildDeviceList добавить такой тестовый код -

var

//**
cd: Cardinal;
//нужно объявить как глобальную переменную вне метода Create_
//**

{...}

//остальное уже в методе Create_

hr:= BuildDeviceList;
if FAILED(hr) then
begin
SAFE_RELEASE(m_pD3D);
Result:= DisplayErrorMsg(hr, MSGERR_APPMUSTEXIT);
Exit;
end;

//**
cd := m_Adapters[m_dwAdapter].dwCurrentDevice;
//**

 

установив точку останова на коде созданной строки вы можете получить в режиме отладки информацию о том, какое текущее устройство устанавливается по-умолчанию.

Используя нижеследующий код, который Вы можете почерпнуть из метода BuildDeviceList можно получить всю необходимую информацию -

var

//**
CurrentDevice, DeviceModeNum: Cardinal;
DesktopMode: TD3DDisplayMode;
p_AdapterInfo: PD3DAdapterInfo;
pDeviceInfo: PD3DDeviceInfo;
DeviceCurrentMode: TD3DModeInfo;
//**

//аналогично нужно объявить как глобальные переменные вне метода Create_, если сделать локальные, то их значения могут стать недоступны при отладке из-за оптимизации в регистрах процессора, поэтому для целей отладки и проверки получаемых значений нужны глобальные переменные

//**
CurrentDevice := m_Adapters[m_dwAdapter].dwCurrentDevice;
DesktopMode := m_Adapters[m_dwAdapter].d3ddmDesktop;
p_AdapterInfo := @m_Adapters[m_dwAdapter];
pDeviceInfo := @p_AdapterInfo^.devices[CurrentDevice];
DeviceModeNum := pDeviceInfo^.dwCurrentMode;
DeviceCurrentMode := pDeviceInfo^.modes[DeviceModeNum];
//**

теперь всё сразу становится очевидно -

сначала определяется текущее устройство CurrentDevice, затем текущий режим рабочего стола (если это Вам потребуется), считывается информация о текущем адаптере, по ней определяется информация о текущем устройстве pDeviceInfo, затем считывается номер текущего видеорежима и определяются его параметры

 

Двигаемся дальше. Если будет обнаружено, что обработчик окна m_hWnd пуст, т.е. требуется создать окно средствами WinAPI, то оно будет создано. Иконка, указатель мыши, цвет фона, стиль, границы, размеры задаются далее.

Если обработчик окна не был пуст, то запоминается указатель на старую оконную процедуру и устанавливается новый, обрабатывающий поступающие сообщения внутри метода MsgProc, а также вызывающий старую оконную процедуру. Это гарантирует корректную обработку поступающих приложению сообщений даже при использовании VCL-окон и приложения работающего на основе TApplication, как это имеет место в примерах всех предыдущих уроков и игре "Ну, Погоди!". Если забыть про этот важный момент - при создании собственного базового класса D3D-приложения, то можно долго гадать о причинах возможных ошибок и некорректной его работы.

 

Метод OneTimeSceneInit целиком зависит от реализации его в производном классе.

Остается рассмотреть метод Initialize3DEnvironment и поэкспериментировать с ним.

 

Заглянув в первые строки кода данного метода сразу определяем, что текущий видеорежим это pModeInfo

вызов AdjustWindowForChange; на самом деле выполняет скрытие окна полноэкранного режима

Далее идет настройка параметров отображения и самое интересное, что служит ответом на второй вопрос, поставленный в конце 3 урока

// Create the device
{//**
hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus, pModeInfo^.dwBehavior, m_d3dpp,
m_pd3dDevice);
}

hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
m_d3dpp,
m_pd3dDevice);

В чём же причина? Если заглянуть в документацию по DirectX 8 ,то в описании IDirect3D8::CreateDevice вы найдете список значений параметра BehaviorFlags

среди них D3DCREATE_PUREDEVICE = $10; и D3DCREATE_HARDWARE_VERTEXPROCESSING = $40; именно то значение, которое имеет данный флаг если использовать строку кода, которая показана закомментированной (зеленого цвета)

Приведенный чуть ниже код исправляет данный недостаток! Причина объяснена в документации по DirectX 8 -

D3DCREATE_PUREDEVICE
Specifies that Direct3D does not support Get* calls for anything that can be stored in state blocks. It also tells Direct3D not to provide any emulation services for vertex processing. This means that if the device does not support vertex processing, then the application can use only post-transformed vertices.

Т. е. установка данного флага не позволяет вызывать методы Get* и требует использования только пост-трансформированных вершин. Метод GetViewport как раз и не выдает при этом нужной информации!

 
оставшийся код располагает окно поверх остальных окон (если используется оконный режим), проверяются возможности устройства и формируется соответствующая информационная строка m_strDeviceStats, запоминаются параметры бэк-буфера, отображается указатель мыши и ограничивается его перемещение заданной областью, происходит вызов методов InitDeviceObjects и RestoreDeviceObjects, в случае ошибок происходит переключение на более низкий уровень возможностей графического устройства и рекурсивный вызов метода Initialize3DEnvironment.
 
По окончании выполнения метода Create_ приложение переходит в состояние готовности и запускается непрерывный цикл отрисовки вызывающий поочередно методы FrameMove и Render. Это происходит внутри метода TAppForm.ApplicationEventsIdle
 
 
 
[назад] [страница 1] [далее] [к содержанию]
 
 
     
     
     
     
подробнее

Game craft - отображение scv модели в формате x в d3d9-приложении

[все уроки game craft]  [моделируем scv]  [моделируем scv шаг 1 часть 2] [моделируем scv шаг 2 часть 3] [Прорисовка текстуры робота SCV шаг 5]  [экспорт робота scv в формат x] 

В предыдущих уроках мы рассмотрели как моделируется, текстурируется и экспортируется модель. Теперь покажем как выводить данную модель в d3d9-приложении.

Модель робота scv в d3d9 - приложении

Вы можете скачать самораспаковывающийся архив, содержащий весь необходимый исходный код

Для нормальной сборки вам также потребуется среда разработки MSVS 2005 и DirectX SDK August 2008.

Теперь попробуем кратко продокументировать код, который содержит приложение d3d9_skin_mesh

Здесь Мы не преследуем формальную цель подробного и досконального описания всего кода, который содержится в модуле D3DAppTemplate.cpp . С полным исходным кодом Вы можете ознакомиться, скачав его по ссылке выше, откомпилировать и запустить полученное приложение, и убедиться, что оно работает.

Выполнение приложения начинается с вызова метода CD3DAppTemplateApp::CD3DAppTemplateApp()

Далее следует остановиться на вызове метода BOOL CD3DAppTemplateApp::InitInstance(), т. к. внутри него создается и скрывается главное окно приложения -

pMainWindow = new CD3DAppTemplateDlg();
pMainWindow->Create(CD3DAppTemplateDlg::IDD);
pMainWindow->ShowWindow(SW_SHOW);
pMainWindow->ShowWindow(SW_HIDE);

Это делается для того, чтобы внутри процедуры InitialD3DAppSettings новое окно, создаваемое и используемое для целей вывода 3D сцены не перекрывалось с основным и не возникало путаницы. Просто создается иллюзия, что окно 3D сцены и есть основное.

void InitialD3DAppSettings()

//...

DXUTCreateWindow( L"D3D9 App Template", 0, 0, 0);

//...

В этой связи возникает вопрос: А почему окно pMainWindow нельзя использовать для вывода 3D сцены ?

Ответ звучит так: окно pMainWindow - это базовое окно MFC приложения, с которым связаны некоторые ресурсы, но для целей вывода 3D сцены оно не пригодно, т. к. DirectX API предполагает для этого только вновь созданное, отдельное окно. В противном случае обеспечить работу D3D в этом окне не представляется возможным. Поэтому именно такой способ и используется в нашем приложении d3d9_skin_mesh

Нетрудно догадаться, что основная работа по подготовке d3d-приложения к работе описана внутри процедуры InitialD3DAppSettings, а собственно цикл работы приложения описан в DXUTMainLoop и заключается в поочередном вызове сначала процедуры void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ), а после неё - void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ).

У Вас может возникнуть вопрос: Как реализуется обработка управления от клавиатуры и мыши ?

В данном приложении она реализована обычными средствами Windows - через функцию MsgProc - но это будет более медленный способ. В реальном игровом приложении это реализуется посредством вызова специальной функции где-то в самом начале процедуры OnFrameMove. Например в игре Веселый Буквоежка для этой цели используется процедура UpdateInput - внутри которой проверяется какие клавиши или действия мышью были использованы пользователем и в ответ на это вызываются соответствующие процедуры, функции или методы которые привязаны к конкретной клавише или действию мышью. Подробнее об этом можно узнать получив полный исходный код движка Fle, на котором написана игра Веселый Буквоежка. Также будут не бесполезны иструменты разработки на движке Fle - SceneEditor, описание механизма сборки локаций и утилита Coords2D.

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

Итак, двинемся по коду d3d9_skin_mesh дальше. После того как все предварительные действия в приложении осуществлены - это как я уже говорил, описано внутри процедуры InitialD3DAppSettings, вызываются поочередно процедуры void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ) и void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ). Внутри них и надо искать ответ на вопросы - как собственно работает d3d-приложение и каким образом это реализовано ?

Очень полезное умение, которое Вам несомненно пригодится - умение задавать себе вопросы и находить на них ответы в коде. Внутри OnFrameMove Вы увидите, как запоминается предыдущее значение таймера в переменной g_fLastAnimTime, там же есть метод вызова камеры (но она пока не используется), а также методы, которые используются для управления обзором игровой сцены вместо камеры - через g_ArcBall.

В процедуре OnFrameRender формируется изображение игровой сцены - сначала выводятся элементы управления g_SettingsDlg, затем очищается backbuffer (невидимый экран, который как только будет подготовлен будет выведен на экран реальный - чтобы изображение не мерцало отображая как на нём рисуются элементы), задаются параметры для источника света и собственно происходит модель робота SCV - DrawFrame.

Резонные вопросы, которые возникают - где, как и каким образом загружается модель и как она затем отрисовывается ? Нужно добавить, что в приложении d3d9_skin_mesh, которое базируется на коде примера SkinnedMesh из DirectX SDK Aug 2008, реализовано отображение не только статичных, но и анимированных моделей. Так что если загрузить модель, в которой есть скелетная анимация - то модель будет выводиться в движении - циклично воспроизводя имеющуюся в ней анимационную цепочку.

Код, который воспроизводит анимацию - достаточно объёмный и Вы его можете посмотреть сами скачав архив по ссылке выше. Традиционно Мы остановимся только на самых важных деталях.

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

Оставшийся код, Вы можете рассмотреть самостоятельно и лучше это делать путём написания нового приложения, которое бы выполняло определенные задачи. Например не только загружало анимированную модель, но и по нажатию клавиш или кликам мышью, заставляло бы перемещатьтся 3D-модель в игровом пространстве. В последующих наших уроках мы именно этим и займёмся: будем рассматривать поэтапно каждую задачу, возникающую в типичном игровом проекте - на примере нашей игры Game Craft, а также будем моделировать все необходимые для этого модели и делать другие сопутствующие вещи (текстуры, описания, звуки, музыку и др.)

В цикле наших уроков Мы постараемся остановиться на следующих вопросах:

- работа с 3d-камерой;
- перемещение модели в пространстве;
- реализация управления игрой от клавиатуры и мыши;
- создание игровых панелей и реализация простейших операций по управлению игрой через игровую панель;
- создание рельефа земной поверхности и его текстурирование;
- вывод рельефа в игре и перемещение по нему моделей;
- модели игровых ресурсов: минералы, гейзер веспен-газа;
- не-интерактивные игровые объекты, формирующие окружающую среду: деревья, кусты, камни и прочее.
- постройка нового коммандного центра в игре рабочим scv;
- добыча ресурсов рабочими роботами scv;
- создание фоновой музыки и сопутствующих игровых звуков;
- создание редактора игровой сцены;

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

В следующем уроке мы займёмся изучением управления игрой от Direct Input и работой с 3d-камерой в d3d9-приложении работа с 3d-камерой в d3d9-приложении

[все уроки game craft]  [моделируем scv]  [Моделируем робота SCV шаг 1 часть 2]  [Моделируем робота SCV шаг 2 часть 3]  [Прорисовка текстуры робота SCV шаг 5]  [экспорт робота scv в формат x] 

подробнее

     
  Вашему вниманию предлагается новый раздел сайта - ГАЛЕРЕЯ 3D-моделей. Если Вы увлекаетесь 3D-моделированием или еще только учитесь создавать 3D-приложения и Вам не хватает 3D-моделей для проработки примеров, а может быть просто - для изучения моделирования на примере чьих-то моделей - ТО ЭТОТ РАЗДЕЛ - ДЛЯ ВАС!   
     
  Здесь Вы найдете 3D-модели в виде архивов WinRar 3.2. Каждый архив содержит следующие файлы: *.max - модель в формате 3Ds MAX 7.0, *.x - модель в формате DirectX, *.bmp - текстура модели.  
     
  Правила работы с моделями: если после открытия модели в формате *.max из 3DS MAX 7.0 появляется сообщение об отсутствии файла текстуры Вам нужно указать правильный путь к файлу в Вашей системе. О том как это сделать рассказано в статье - Подготовка модели к использованию. Модели *.x пригодны сразу же для использования в DirectX-приложениях. Файл *.bmp или *.jpg - это текстура модели, поэтому при использовании моделей важно чтобы приложение могло найти и файл с текстурой иначе модель будет сплошного однотонного цвета. Для этого располагайте файл с текстурой в той же папке, что и модель или правильно прописывайте пути к файлам в своих приложениях!  
     
  Вы легко можете конвертировать модель в формате *.max в формат *.x - для этого Вам понадобится стандартный плагин из DirectX SDK 9.  
     
  щелкаем на изображении, скачиваем архив с моделью и текстурами  
     
  все модели (если это не указано особо) в формате 3ds max 7  
     
  анимированная модель авто murocar  
     
  модель автомобиля muro-car Файл-архив - 552 Кб. Анимировано вращение колес.

Игры, в которых применялись данные модели -

Дорога в Город

 
     
  Бобби - простая низкополигональная модель  
     
 

"Бобби" - довольно простенькая низкополигональная модель. (архив - 152 Кб) Текстура-развертка полностью рисована в Corel Draw11.

некоторые из моделей данных авто послужили в качестве элементов титульной заставки игры Дорога в Город.

 
     
  Круизер из игры "Дорога в Город"  
     
  Круизер - аналог машины, которая ездит по дорогам в игре "Дорога в Город" Средней сложности модель. Развертка сделана в Corel Draw. (248 Кб).  
     
  Военный защитный джип или просто Милитари  
     
  Военный джип. Модель претендует на низкополигональность - поэтому колеса так угловаты. Во всех играх, особенно в стратегиях, колеса такого вида, чтобы снизить число полигонов у модели! Проработан салон машины. (199 Кб).  
     
  Самосвал или грузовик  
     
  Грузовик-самосвал Отличный грузовичок - сразу можно в игру вставлять! (209 Кб).   
     
  Экскаватор  
     
  Экскаватор - тщательно проработанная модель. Используется две различные текстуры - основа - от грузовика, экскаваторная часть - другая текстура. Архив - 382 Кб.  
     
  Цистерна  
     
  Цистерна - в комплекте 2 текстурных развертки. Основа - от грузовика + цистерна.  
     
  Набор из 16 моделей проекта ТМГ  
     
 

Набор из 16 моделей проекта ТМГ (Тайны Морских Глубин) в формате 3ds max 7 - 65,8 Mb

bcp - катер береговой охраны
cargoship - грузовой корабль
civilyacht - яхта
esubmarine - подлодки
floor_vehicle - донный вездеход
motorboat - моторка
nx4 - подлодка nx4
pbb - пиратский катер
sails - простые модели моряков
sciencebtsc - нии батискаф
sfboap - катер на воздушной подушке
sfboap - боевой катер
sfcruiser - крейсер
steamship - теплоход

В архиве модели в формате 3ds max7, текстуры, скетчи

 
     
  Данные модели часть пока еще не вышедшего проекта ТМГ - Тайны Морских Глубин   
     
  Набор из нескольких моделей проекта Нечто: Необъяснимое  
     
 

Набор из нескольких моделей проекта Нечто: Необъяснимое - в формате 3ds max7, текстуры *.jpg - 6,21 Mb

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

 
     
  Некоторые из моделей текущего проекта Нечто: Необъяснимое  
     
  Модель Фрейма Исхода из игры Периметр  
     
 

Модель Фрейма Исхода из игры Периметр. Взята с официального сайта http://www.kd-lab.com, пересохранена в формате 3ds max 2009, содержит также текстуру и экспортированную directx модель - 866 Кб.

Игра Периметр

 
     
     
     
     
     
подробнее

     
     
  уроки Photoshop - чудеса  
     
  Уроки Photoshop - Чудеса  
     
  Урок, который Вы запросили входит в полную версию Уроки Photoshop - Чудеса и недоступен онлайн, для изучения этого урока и еще 7 уроков, входящих в комплект, Вам нужно заказать полную версию.  
     
 

Вы можете заказать полную версию Уроки Photoshop - Чудеса

стоимость продукта 100 р.

 
     
 
 
     
  Сразу же после подтверждения оплаты в течение 1-3 дней будет выполнена электронная доставка продукта Уроки Photoshop - Чудеса на Ваш e-mail, указанный при оформлении заказа  
     
  Спасибо за внимание!  
     
Содержимое данной страницы доступно только зарегистрированным пользователям.



Пожалуйста войдите на сайт - Вход

или пройдите процедуру регистрации - Регистрация

megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 1,2500