![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
Master Lucky |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.1.2008 Где: Торонто, Канада Репутация: нет Всего: нет |
||||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
php |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Вообще в принципе ошибки на данном участке кода могут возникать довольно редко,
я по крайней мере на своей практике их не встречал, разве что из-за неправильно установленного или используемго SDK (версии SDK), мы ведь там просто указываем программе какую версию DX мы хотим использовать, в принципе этот интерфейс нам больше и не нужен, это всё так скать начально заготовочная "мишура" нужна лишь к подготовке к созданию нашего основного Direct3D устройства, вот там уже на этапе создания этого устройства согласен могут возникнуть уже серьёзные ошибки и отлавливать их нужно уже более внимательно, может там у меня в коде не всё гладко и чисто как хотелось бы, нужно бы подредактировать сделать более серьёзную обработку ошибок, замечания и предложения естественно принимаются!.. ![]() Теперь разберём этот искомый участок кода: Я постараюсь просто объяснить подробнее почему я так сделал и в коде присутствует именно такая запись:
С точки зрения мышления человека да это может и не правильно согласен, но давайте попробуем разобраться с точки зрения логики машины как бы смешно это не звучало: Итак, что у нас сначала происходит заведомо обнуляем интерфейс:
Затем указываем данному интерфейсу какую версию DX SDK мы хотим использовать здесь:
Создался там этот интерфейс или не создался нам глубоко "не важно" Здесь мы выводим причину чисто для отладки:
Здесь читаем медленно вдумавшись: ![]() ЕСЛИ интерфейс не создан то он вернёт значение NULL, но вот здесь проверяем:
ЕСЛИ ВДРУГ (не исключаем такую ситуацию) всё таки интерфейс был создан и вернул не NULL, то предварительно очищаем его, и какой тогда сымысл если он вернул NULL его опять освобождать если он изначально был NULL, т.е освобождать освобождённое - это может уже привести даже к ошибкам в системе типа Access Violation и даже возникновению "синего экрана" (хотя это вряд-ли ![]() В конце мы этот интерфейс вообще "выкидываем" за ненадобностью, т.к нужную версию SDK мы определили и установили:
Так, что с точки зрения логики самой программы эта запись верна, и вообще честно говоря не вижу смысла здесь, что либо менять или переделывать, другое дело на этапе создания уже самого устройства там надо бы подлатать код, "грязновато" оформлен я бы сказал! Это хорошо, что вы обратили внимание, я рад был разъяснить - обсуждение движка идёт полным ходом - это радует! Так, что спрашивайте или указывайте на ошибки всё будем разбирать вместе на то и делается уклон! Кстати скоро появится вторая часть статьи.. А комментарии мне пожалуй делать всё таки придётся, т.к здесь этот участок кода видимо остался без внимания и плоховато задокументирован и возникли небольшие вопросы.. Нда целая диссертация опять получилась, никак у меня не получается короче! ![]() Это сообщение отредактировал(а) php - 23.4.2009, 04:28 --------------------
Джедаи не пройдут.. |
||||||||||||
|
|||||||||||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
||||
|
||||
php |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Часть 2. Программирование игрового движка (Продолжение..)
Вступление. Итак продолжим разработку игрового движка, сорри за столь длительный перерыв, было много дел.. В данных разделах мы рассмотрим, как осуществляется привязка камеры к движку, также начнём работу с текстурированием и моделированием простейших объектов - создадим SkyBox, понятие SkyBox разбиралось в предыдущей статье так, что можно прочитать, что это такое и для чего это нужно именно там. Рассматривать и разбирать как делаются всякие детские вращающиеся кубики мы не будем, а займёмся серьёзными "игровыми" вещами.. мы же с вами делаем игру, а не рекламный ролик ![]() 2.2. Привязка камеры к проекту. В данном разделе статьи мы рассмотрим как привязать "камеру" к нашему проекту. Как уже описывалось ранее сама камера будет реализована на DirectInput. Для этого выполним следующие действия: 1) Для начала создадим новый файл под названием GR_Camera.cpp: Для этого в "дереве" нашего проекта выбираем Source Files и нажимаем на нём правой кнопкой мыши, далее из выпадающего меню выбираем Add->New Item.. В общем делаем всё по аналогии как описано в пункте 2.1. предыдущей статьи, только не забудьте этот созданный модуль сохранить в папку Engine_Modules (или как она у вас там теперь называется?? ![]() 2) Также необходимо создать файл GR_Camera.h: Для этого также в "дереве" проекта выбираем Header Files, и не забываем сохранить этот файл также в папке Engine_Modules. Всё мы создали заготовки файлов GR_Camera.h и GR_Camera.cpp (пара - заголовочный .h и .cpp файлы). Начинаем программирование.. 2.3. Подключение и инициализация устройства ввода DirectInput. Для начала прежде чем работать с "камерой" в движке мы должны подготовить и инициализировать устройство ввода, т.е. иными словами подключить возможность управления объектами или вращением объектов используя клавиатуру или мышь, будь то просто управление "взглядом" камеры дающее возможность непосредственно оглядываться да и просто смотреть по сторонам, или обработка нажатия кнопок мыши или клавиатуры для реализации "выстрелов" из оружия к примеру... Всё это мы будем делать и разбирать в дальнейшем. Поток данных поступаемых от клавиатуры или мыши обрабатывается непрерывно в следствие чего возможна обработка одновременного нажатия нескольких кнопок на клавиатуре, мыши, тут же одновременного вращения и обзора мышью по сторонам, чем и был обусловлен переход GRE на DirectInput. 1) Для начала необходимо выбрать из "дерева" нашего проекта GR_Engine.h сделав на нём двойной щелчок мыши, стереть полностью его содержимое и заменить на это:
Теперь разберём следующий участок кода:
Здесь в участке кода мы объявляем глобальную переменную FormL_HWnd которая будет хранить в себе значение или Handle нашего ранее созданного окна для вывода графики (обычно все окна в системе Windows имеют свой уникальный номер (даже скрытые и невидимые) для того, чтобы ось (операционная система) могла определить различные привязки, вызовы, какие окна запущены и работают, и просто знать к какому конкретному окну происходит обращение, и обратиться к нему можно по этому уникальному номеру который и будет "передан" и присвоен этой нашей переменной). В принципе, получив нужный Handle окна можно делать с ним практически, что угодно - менять заголовки, надписи в самой форме этого окна, получать его изображение, но это мы пожалуй разбирать здесь уже не будем, так как это уже выходит за рамки документации GRE.. 2) Теперь из "дерева" проекта выбираем GR_Engine.cpp - делаем также на нём двойной щелчок мыши, стираем полностью его содержимое и меняем на это:
3) Теперь займемся программированием самой DirectInput "камеры" и DI-устройства, для этого вернемся к ранее созданному модулю GR_Camera.h выделив и сделав на нем двойной щелчок мыши в "дереве" проекта и заполним его следующим кодом:
4) Модуль GR_Camera.cpp заполняем этим кодом:
А сейчас разберём следующий участок кода:
Здесь происходит подключение и привязка устройства мыши к нашему окну, как видите, здесь фигурирует HWND переменная _HWnd - хендл нашего окна, вот здесь при подключении мыши и позже клавиатуры мы её и применяем. Примечание! Следует также отметить, что после установки кооперативного режима мышь полностью перехватывается нашим приложением, и курсор мыши становится невидимым, но чтобы его увидеть вновь - необходимо вызвать метод m_pMouse->Unacquire(); и остановив обработчик gr_Camera->UpdateCamera(); тогда наше приложение "отпустит" мышь восвояси. Также курсор можно будет сэмулироать и отрисовывать отдельно, но это можно будет реализовать позже - уже при разработке графического интерфейса GRE.. Это сообщение отредактировал(а) php - 5.9.2014, 07:13 --------------------
Джедаи не пройдут.. |
||||||||||||
|
|||||||||||||
php |
|
||||||||||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
2.4. Собираем "куб".
1) Для начала создадим новый файл под названием GR_SkyBox.cpp: Для этого в "дереве" нашего проекта выбираем Source Files и нажимаем на нём правой кнопкой мыши, далее из выпадающего меню выбираем Add->New Item.. Делаем те же действия, что и при создании файла модуля GR_Camera.cpp, не забываем этот файл сохранить в папке Engine_Modules. Наполняем файл следующим кодом:
2) Создаем файл GR_SkyBox.h: Для этого также в "дереве" проекта выбираем Header Files, и не забываем сохранить этот файл туда же в папку Engine_Modules и наполняем этот файл следующим кодом:
3) Если заметите в разделе include я использую #include <GR_Methods.h> В этом модуле содержатся различные вспомогательные процедуры и функции которые вызываются в движке это различные таймеры, диалоговые окна и др. Создаём и его - для этого в "дереве" нашего проекта выбираем Source Files и нажимаем на нём правой кнопкой мыши, далее из выпадающего меню выбираем Add->New Item.. и сохраняем его под именем GR_Methods.cpp в папку Engine_Modules. Код файла модуля будет следующим:
4) Также создаём и файл GR_Methods.h выбрав для этого из "дерева" проекта Header Files, и сохранив в папку Engine_Modules. Код модуля:
Добавлено @ 06:53 Ну вот теперь почти всё готово. Теперь разберём некоторые участки кода в модуле SkyBox.cpp:
Здесь происходит создание вершинного буфера, он служит для хранения набора вершин объекта и представляет из себя сплошной блок памяти, также позволяет вполне компактно хранить и обрабатывать информацию о вершинах, в качестве параметров здесь указывается формат вершин (структура хранящая данные о координатах, цвете и нормалях вершин, а также координаты текстур и многое другое, иными словами называемая ещё как FVF (Flexible Vertex Format)) и размер буфера с параметрами размещения буфера в памяти. Как мы видим, для указания формата вершин используется константа D3DFVF_SKYBOXVERTEX объявленная в модуле GR_SkyBox.h. Для получения доступа к данным буфера используется метод Lock интерфейса m_pVertexBuffer, здесь копируются в адрес Vertexes подготовленные описания наших вершин
После заполнения вершинного буфера данными необходимо вызвать метод Unlock, если этого не сделать, то отрисовка SkyBox происходить не будет, да это может вызвать и ошибку работы движка, т.к сам буфер мы изначально перевели в заблокированное состояние, поэтому после всех манипуляций его необходимо разблокировать:
Создание индексного буфера
Примечание! Вообще можно было бы обойтись созданием только лишь вершинным буфером, но как оказывается на практике данный способ может приводить к некоторым трудностям при работе только лишь с вершинами, оказывается, что это очень неэкономичный способ, т.к приходится дублировать эти вершины в вершинном буфере, и применяется для создания лишь самой простейшей геометрии, хотя наш "скайбокс" и не обладает сверхнавороченной геометрией, всё же лучше использовать индексный режим вывода геометрии, т.к данный способ позволяет использовать для описания треугольников не сами вершины, а их индексы (порядковые номера в вершинном буфере). Это позволяет не только не дублировать вершинные данные, но и экономить память (целочисленные индексы занимают намного меньше места, чем вершинные). Далее разберём код в рендере самого SkyBox:
Тут задаются параметры текстурного сэмплера, здесь кроется ключевой момент в отрисовке и рендеринга текстур самого SkyBox-а. Режим "сэмплера" CLAMP обеспечивает "затирание" стыков в углах и граней SkyBox, если этого не сделать, то сразу будут бросаться в глаза ярко выраженные линии стыков по углам, от чего вся иллюзия целостности и объемности пространства полностью сойдет на нет.. Но для того, чтобы добиться нормального результата работы данного режима "сэмплирования", каждая текстура кубической карты должна быть строго одинакового размера, если допустим у вас размер текстуры кубической карты 256x256 то и размер всех остальных текстур должен быть таким же, иначе может получиться эффект "сползания" текстуры вбок, и как результат некорректное и некрасивое отображение и отрисовка.. Вообще если заметить то стыки на границах "скайбокса" можно было наблюдать достаточно во многих старых играх, я встречал даже и в более новых.. 5) В конце не забудьте положить скачанные текстуры SkyBox-а в папку, которая создаётся после компиляции проекта и называется "Debug" в ней обычно создаётся и хранится сам скомпилированный *.exe-файл проекта GRDebugger.exe, а также файлы объектов *.obj которые создаются в результате компилирования модулей *.cpp и *.h самого GRE. Эти файлы должны лежать по пути: ../GreenRay/GRDebugger/Debug/Textures/SkyBox/GrandCanyon/ Название конечной папки может называться и по другому на ваше усмотрение, в нашем случае она называется GrandCanyon, в ней должны лежать файлы с именами соответствующими сторонам SkyBox-куба это: xneg.png, xpos.png, yneg.png, ypos.png, zneg.png, zpos.png, т.е всего 6 файлов, форматы файлов могут быть и другими такие как Jpg, Bmp и др. Этот набор файлов необходим для формирования так называемой кубической карты "CubeMap" далее эти текстуры накладываются на внутренние грани самого SkyBox-куба, в определённом порядке в результате чего формируется эффект окружения и 3-х мерное представление какого-либо помещения, мира, ландшафта, космоса и планет. Эти текстуры можно получить или сделать в специализированных программах, или они фотографируются специализированным оборудованием и фотокамерами в определённой проекции, наиболее распространённый метод для фотографирования это кубические проекции, снимаются в шести взаимно перпендикулярных направлениях (включая верх и низ), и представляются в виде крестообразной развёртки: ![]() Примечание! Не забудьте, если у вас папка будет иметь другое имя и путь, то необходимо этот путь изменить и в коде движка, иначе текстуры загружаться не будут, что приведёт к ошибке и закрытию приложения GRE. Посмотрим на участок кода в модуле GR_Engine.cpp где происходит создание класса SkyBox:
Здесь создаётся класс "Скайбокса", указываются его размеры в данном случае 100, ну и соответственно пути к нашим CubeMap-текстурам. Примечание! Текстуры CubeMap для движка или другие дополнительные текстуры SkyBox можно взять отсюда: www.codemonsters.de/home/content.php?show=cubemaps 2.5. Заключение. Итак в итоге после компиляции проекта должно получиться как на рисунке представленном ниже: ![]() Или ещё вот такой вариант загрузки SkyBox: ![]() Также рекомендуется проверить как работает наша игровая камера, если всё в порядке и камера подключилась нормально то мы сможем осмотреться вокруг, вверх и вниз, ну а если при движении мыши ничего не происходит значит устройства ввода не работают, либо неправильно были переданы какие-либо параметры, либо не произошла инициализация библиотеки DirectInput. В следующих статьях мы будем подключать физический движок - PhysX, загрузим небольшой примитивненький уровень, поработаем над его освещением, и научим нашего игрока не "проваливаться" сквозь стены.. До новых встреч! Keep smile! Пока! ![]() _________________________________________________________________________ © Digital Dreams Development Inc., 2009 (С) GR-Engine Technical Documentation. при поддержке © Polarity Soft Engine Inc. Любая публикация изложенного материала только с разрешения автора. Это сообщение отредактировал(а) php - 5.9.2014, 07:14 --------------------
Джедаи не пройдут.. |
||||||||||||||||||||
|
|||||||||||||||||||||
arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 6 Всего: 61 |
оффтоп: многовато копирайтов ![]() |
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
![]() вписывать не буду, этих достаточно будет.. --------------------
Джедаи не пройдут.. |
|||
|
||||
nogoody |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 12.9.2007 Где: Смоленск Репутация: нет Всего: нет |
Попробовал пример, единственное ругался на dmusici.h, пришлось закоментить
А так все супер, очень жду продолжения, автору спасибо ![]() |
|||
|
||||
ShellRaiser |
|
||||||
![]() еще чуть и закоммичу ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 20.7.2007 Где: Белaрусь, Гродно Репутация: 1 Всего: 1 |
php, а ведь он как бы прав=) я бы написал как по твоим описаниям вот так вот:
ну ет если логически подумать;) |
||||||
|
|||||||
N.M.Guard |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.1.2008 Репутация: нет Всего: нет |
php спасибо большое за статью!!! С удовольствием жду продолжения !!!
P.S. Для удобства обсуждения можно каждое продолжение в отдельную тему писать!!! ![]() Это сообщение отредактировал(а) N.M.Guard - 18.7.2009, 13:48 |
|||
|
||||
pirat77 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 10.11.2008 Репутация: нет Всего: нет |
Так как только ещё учусь C++,обратил внимание на этот урок (за что его создателю спасибо) ,но вот почему то возникла такая проблема при debug'е
![]() ![]() Это сообщение отредактировал(а) pirat77 - 26.7.2009, 09:32 |
|||
|
||||
php |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
pirat77 Данная ошибка показывается самим движком GRE, чтобы удобнее было устранять и узнавать где когда и почему произошла ошибка, эта ошибка, что произошла в
вашем случае может выводиться по двум причинам: из-за физического отсутствия папки с текстурами на диске или неверно прописанного пути в теле программы, и если текстура не найдена или не загружается, то GRE выводит подобную ошибку, но судя по вашему ответу папка с текстурами у вас всё же существует, в вашем случае можно поступить двумя способами: 1. Скопировать папку Textures в папку где лежит файл проекта .sln по умолчанию он должен лежать в папке GRDebugger, но только учтите, что скоро в движке будут реализовываться модели - сами файлы моделей тоже будут лежать в папке Debug и вам придётся постоянно их "дублировать" если захотите запустить движок в режиме отладки, что на мой взгляд не совсем удобно.. 2. Как можно увидеть в движке путь к папке с текстурами указан частично: "\Textures\\SkyBox\\Arch\\zneg.png", что из этого следует - он обработает этот путь только из текущей папки проекта или откуда был запущен exe-шник самого движка, но можно указать путь явным образом, к примеру: "C:\\GreenRay\\GRDebugger\\Debug\\Textures\\SkyBox\\Arch\\zneg.png", но тут опять могут возникнуть проблемы, если вы к примеру принесёте движок к другу и запустите он у него работать не будет если путь будет отличаться от выше приведённого или располагаться в другой папке или диске...
Хм странно, вообще это DirectMusic Interface, нужен будет позже когда будет подключаться возможность проигрывания файлов mp3 в GRE, и обычно находится а разделе Include DirectX SDK, проверьте может неверно прописаны пути к папке Include или некорректно установлен Сам DX SDK, если не поможет могу выложить этот файл сюда..
Ок так и сделаем в следущий раз.. ![]() Это сообщение отредактировал(а) php - 27.7.2009, 08:29 --------------------
Джедаи не пройдут.. |
||||
|
|||||
stuqs |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 26.7.2009 Репутация: нет Всего: нет |
Статья интересная спору нет. Но она изложена все же для понимающих людей, кто разбирается в функциях DirectX, что зачем идет и тд. Очень хочется понимать весь код - поэтому большая просьба выложить название каких-нибудь книг, самоучителей по DirectX на C++ где можно будет разобраться с самого начала. ( а то вставлять чужой код и получать работающие программы интересно, но намного интереснее писать свой код) Гугл в помощь просьба не давать, находил много книг, но устаревших с не актуальной информацией(нет уже таких библиотек или приемы уже не используются теперь такие).
Заранее благодарю. |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
stuqs, а стандартная документация чем плоха?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |