![]() |
||
Как создать игру ? - Программируем сами. Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше. |
||
[содержание] [назад] [страница 2] [далее] | ||
Изучаем и модифицируем пример CreateDevice - страница 2 | ||
Наилучшее понимание и усвоение достигается в том случае, когда созданная Вами или другим человеком программа выполняет то, что Вы хотели, и Вы знаете как изменить ход выполнения, таким образом, чтобы получить результат в пределах возможных вариантов. Программа CreateDevice достаточно проста. Основая цель: создание окна приложения и подключение к функциям DirectX. Вариантов тут немного: изменить внешний вид приложения или изменить способ подключения к функциям DirectX. |
||
Во внешнем виде приложения CreateDevice можно изменить следующее: - размеры и заголовок окна, набор кнопок в окне заголовка; - создать иконку приложения; - изменить цвет рабочей области; Способов подключения к функциям DirectX на самом деле всего 2, да больше просто и не нужно. Первый способ Вы уже рассмотрели - он как раз и приведен в примере CreateDevice. Второй способ мы пока рассматривать не будем, но он будет рассмотрен нами в дальнейших уроках. Скажу лишь, что выглядит он возможно несколько более сложным, особенно для новичков, но зато он более удобен и быстр для использования - за счет включения функций из модуля DXUT. |
||
Решим поставленную задачу. Размеры и текст заголовка окна представляют из себя параметры функции CreateWindow, которая находится в коде функции wWinMain |
||
//
Create the application's window HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, wc.hInstance, NULL ); |
||
Другими словами окно имеет имя: D3D Tutorial, текст в заголовке окна "D3D Tutorial 01: CreateDevice", координаты x, y и размеры width, height окна | ||
Попробуйте задать другие параметры, сохранить изменения, выполнить компиляцию - клавиша [F7] и запустить созданное приложение. Как видите всё очень просто. |
||
Набор кнопок в заголовке окна - |
||
Эти кнопки находятся в правой части окна - слева-направо - кнопка сворачивания, кнопка максимизации во весь экран, кнопка закрытия. | ||
Большинство игровых приложений требует для своей работы размеров окна, соответствующих одному из стандартных разрешений экрана, например 800х600, изменение размера, кроме изменения разрешения экрана, не допустимо, поэтому если Ваша игра будет работать в оконном режиме, а это обязательно требуется на стадии отладки, требуется запретить кнопку максимизации, а также запретить изменение размеров окна. |
||
Эта цель достигается следующей строкой кода, которую нужно записать сразу после строки вызова функции CreateWindow - // я закомментировал строку со старыми параметрами размеров окна //и
задал новые // сделал окно неизменяемых размеров, содержащее системное меню, кнопку закрытия и //минимизации
SetWindowLong( hWnd, GWL_STYLE, |
||
Изменить цвет рабочей области также не составляет труда - Находим функцию Render и изменяем строку кода //
Clear the backbuffer to a blue color на следующую g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0xFF00FF00, 1.0f, 0 ); |
||
В этом случае окно будет заполняться зеленым цветом. Вообще код цвета определяется так 0xAARRGGBB, где АА - значение от 0 до FF соответствующее цвету альфа-канала - непрозрачности - 0 - соответствует полной прозрачности, FF (255) - полной непрозрачности. RR, GG, BB - соответственно определяют цветовые каналы Blue, Green и Red - т. е. интенсивность от 0 до FF синего, зеленого и красного составляющих цвета. Задать любой нужный Вам цвет можно следующим образом - Запустить Photoshop, вызвать диалог выбора цвета, щелкнув в панели инструментов цвет переднего либо заднего плана, выбрать желаемый цвет и посмотреть полученный код цвета - |
||
![]() |
||
К значению #c7c048 Вам нужно добавить лишь желаемую полупрозрачность цвета, подставив значение от 00 до FF в результате получим цвет 0xFFC7C048 |
||
![]() |
||
Нам осталось научиться создавать иконку для приложения, и включить её в приложение CreateDevice | ||
Для создания иконки Вам потребуется Photoshop. | ||
[содержание] [назад] [страница 2] [далее] | ||
![]() |
||
Как создать игру ? - Программируем сами. Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше. |
||
[содержание] [назад] [страница 5] [далее] | ||
Введение в 2d-игры - игровое меню | ||
Внутриигровое меню может быть главным меню, содержащим пункты <Начать игру>, <Продолжить>, <Настройка>, <Авторы>, <Справка>, <Выход> и какие-либо еще. В игровом процессе меню может быть представлено в виде отдельной панели, содержащей какие-либо кнопки - выхода в главное меню, скрытия панелей или еще что-то. | ||
В качестве изображений активных элементов меню служат, как правило, прямоугольные изображения. Принцип работы меню прост - при попадании указателя мыши в указанную прямоугольную область (она может и не совпадать по размерам с размерами изображения, используемого в качестве активного элемента меню) и нажатии левой кнопки мыши должно обрабатываться действие, связанное с данным пунктом меню. Т. о. алгоритм создания и использования меню может быть такой - + подготовить изображения для элементов меню загрузив их в память; + определить прямоугольные области для пунктов меню; + определить обработчики пунктов меню - описать функции и их реализации; Для обработки управления меню посредством мыши используются средства DirectInput8. |
||
Загружать и использовать изображения Вы теперь умеете - если нет, то обратитесь к предыдущему уроку, посвященному этой теме. | ||
Остается разобраться как определяются прямоугольные области и как пишутся обработчики для пунктов меню. | ||
В игре Веселый Буквоежка, если она уже у Вас установлена, можно заглянуть в подпапку Media\control\mainmenu и открыть файл btn_areas.txt | ||
Внутри этого файла описаны строки вида - new_game; 0.2300f; 0.2633f; 0.9200f; 0.1033f; |
||
что означает - name; Left; Top; Right; Bottom; name представляет имя пункта меню - это своего рода комментарий, чтобы было понятно, к чему относятся последующие данные; Left; Top; Right; Bottom; определяют соответственно левую, верхнюю, правую, нижнюю границы прямоугольной области для пункта меню и описаны в векторной системе координат, где 0.0f, 0.0f - это центр экрана, x = -1.0f левый край экрана, x = 1.0f правый край, y = 1.0f верхняя граница экрана, y = -1.0f нижняя. |
||
Определение
этих параметров удобно выполнять используя утилиту
Coords2D запустите файл Coords2D_setup.exe и распакуйте архив, запустите файл Coords2D.exe После запуска выберите пункт меню File > Reload. Более подробные инструкции читайте в файле readme.txt |
||
Для того, чтобы определить значения Left; Top; Right; Bottom; утилитой Coords2D нужно задать параметры элементов меню в файле tex_list.txt с которым работает утилита ( подробнее см. readme.txt ), далее жмём File > Reload и видим созданное меню на экране. Теперь остается только подводить указатель мыши к участкам на экране и записывать координаты выводимые в левом верхнем углу. Не забудьте еще учесть поправку на координату Y = -0.02f, она вводится, т. к. верхняя часть рабочего пространства утилиты занято строкой меню, чем и обусловлен этот небольшой сдвиг, требующий поправок. | ||
![]() |
||
Загружаем данные о прямоугольных областях активных элементов меню из текстового файла btn_areas.txt Я приведу фрагменты кода из класса CGameMainMenu -
|
||
// данный метод выполняет чтение указанного текстового файла и обрабатывает // // // // указанные в нём параметры меню, занося их в массив CPtrArray, откуда затем к ним // // удобно обращаться как к объектам вида LPBTNAREADESC void
CGameMainMenu::LoadBtnAreas(CPtrArray* pAreasArray,
LPBTNAREADESC btnArea;
// определяем полное имя файла //
если файл не существует - ошибка заносится в лог-файл, приложение завершает
// // // работу //
открываем указанный файл для чтения, если он пустой - ошибка в лог и выход
if (textFile.GetLength() == 0) // перебираем все строки текстового файла и обрабатываем их, формируя объекты // // // LPBTNAREADESC // подразумевается жестко определенная структура файла, если она отличается от // // // требуемой - это приведет к непредсказуемым последствиям !
int iItem = 0; // код функции ReadNextParam вы найдете в ПОЛНОМ ИСХОДНОМ КОДЕ игры
ReadNextParam(&ParamStr, &ParamCharPos, &strValue);
ReadNextParam(&ParamStr, &ParamCharPos, &strValue);
ReadNextParam(&ParamStr, &ParamCharPos, &strValue);
ReadNextParam(&ParamStr, &ParamCharPos, &strValue);
ReadNextParam(&ParamStr, &ParamCharPos, &strValue); pAreasArray->Add((void*)btnArea);
iItem++; } |
||
Теперь покажем код, который обрабатывает выбор пунктов меню пользователем при помощи мыши - | ||
// данный метод должен вызываться в методе FrameMove анимации сцены void
CGameMainMenu::Anim()
void
CGameMainMenu::AnimMenuCursor() //
если приложение не в состоянии показа меню - выход // обработка выбранного пункта меню m_iSelectedBtnItem
= SelectMainMenuItem(); } |
||
int
CGameMainMenu::SelectMainMenuItem() //
получение идентификатора Area выбранного пункта меню, если указатель вне
// // // // пределов меню - возвращается значение -1 // обработка данного пункта меню switch
(Area) case MenuItem1: { // здесь описываются конкретные действия, которые нужно выполнить при выборе // // // // данного пункта меню break; } case MenuItem2: { // здесь описываются конкретные действия, которые нужно выполнить при выборе // // // // данного пункта меню break; } case MenuItem3: { // здесь описываются конкретные действия, которые нужно выполнить при выборе // // // // данного пункта меню break; } } return Area; } |
||
Функцию TargetBtnArea можно найти в ПОЛНОМ ИСХОДНОМ КОДЕ игры. | ||
В следующем нашем уроке мы разберем как перемещать и анимировать персонажа. | ||
Если у Вас всё же остались вопросы - не стесняйтесь задавать их на форуме или по e-mail. | ||
[содержание] [назад] [страница 5] [далее] | ||
Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр. | ||
Создание анимации вращающихся колес автомобиля | ||
Продолжаем серию уроков, посвященных разработке Delphi DirectX игры. В данном уроке рассказывается об особенностях создания анимации простыми трансформациями объектов пригодной для экспорта в DirectX8 и DirectX9-приложение. |
||
[Все уроки 3ds max] [Галерея моделей] [далее] | ||
При разработке проекта Нечто: Необъяснимое возникла необходимость в создании анимации простыми трансформациями объектов. | ||
![]() |
||
Мы будем выполнять данную работу на примере 3Ds Max 7. Но если вы будете использовать 8 или 9 версию, то всё описанное также возможно применить к этим версиям. | ||
Постановка задачи: была создана модель авто показанная на рисунке. Она состоит из кузова и 4 колес представленных отдельными мешами. Требуется создать анимацию вращающихся колес. | ||
Первое что приходит в голову, это просто взять объекты колес и вращать их во времени вокруг своей оси. Казалось бы - всё просто. Но оказывается, что при этом, поскольку модели колес созданы на основе цилиндров (примитив Cylinder) повернутых на 90 градусов вокруг оси Y, то попытка вращать полученные колеса вокруг оси X приводит к сложному повороту сочетающему изменение первоначальной ориентации. Иными словами нужную трансформацию создать не удается. Кроме того, если Вы попробуете экспортировать даже статичную модель данного авто в таком виде - кузов и 4 колеса, то колеса почему-то окажутся совсем не на своих местах. Это касается как экспорта экспортером DXExport DX9, так и PandaDX для 3Ds Max 7. Кроме того, в приложении DX8 анимацию возможно корректно использовать только при экспорте PandaDX! |
||
Что же делать? Решение оказывается тривиально простым если использовать так называемые Dummy-объекты и построить из них иерархию. Что такое Dummy? Это пустой не отрисовываемый бокс, который может играть роль центра трансформаций, а также служить связующим звеном в иерархии объектов. В 3ds Max 7 данный объект находится в панели Create в группе Helpers - |
||
![]() |
||
Если Вы внимательно посмотрите на рисунок авто приведенный в начале данной статьи, то как раз увидите эти боксы. Они расположены и около кузова - 1 большой и около каждого из колес. | ||
Каким образом применить полученный объект для решения поставленной задачи? Нужно создать 1 большой бокс из Dummy-объекта и разместить его по центру кузова авто - создать объект Dummy, отмасштабировать до нужного размера, выровнять по центру относительно кузова (Align). |
||
Далее нужно создать меньший Dummy и выровнять относительно одного из колес. Теперь нужно осуществить привязку (установить иерархическую связь) меша данного колеса к данному малому Dummy - wheel_Dummy. Это выполняется выбором объекта колеса (wheel), нажатием на кнопку Select And Link и протаскиванием пунктирной линии связи до родительского объекта wheel_Dummy пока он не станет выделен белым. После этого wheel_Dummy становится родительским объектом для wheel и вращая wheel_Dummy вокруг оси X можно получить требуемое вращение колеса. После того как Вы это сделаете - т.е. запишете анимацию вращения данного wheel_Dummy на протяжение требуемого количества кадров, Вам остается только клонировать данный wheel_Dummy еще 3 раза, разместить копии относительно оставшихся 3-х колес и осуществить привязку этих колес к соответствующим им Dummy-объектам. В результате все 4 колеса будут вращаться одинаково. |
||
Теперь Вам остается только выполнить привязку кузова авто к большому Dummy-объекту - base_Dummy, и к нему же привязать Dummy-объекты для всех 4-х колес. В результате у Вас получится следующая иерархия объектов - GraphEditors > New Schematic View |
||
![]() |
||
А экспорт посредством PandaDXExporter даст требуемый результат. | ||
Если у Вас возникли вопросы касающиеся деталей выполнения описанных действий, то советую Вам сначала обратиться к статьям - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) |
||
[Все уроки 3ds max] [Галерея моделей] [далее] | ||