![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
php |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Программирование игрового движка GR-Engine.
Автор: php (Танцер Максим aka Verg) Введение. Здравствуйте друзья! Представляю вашему вниманию свой первый коллективный проект посвящённый циклу статей по разработке и программированию игрового движка. Первый цикл статей будет предназначен в основном для начинающей аудитории для тех кто ещё не умеет программировать, но уже хочет быстро начать "делать свою игру" без каких-либо лишних заморочек. Второй и последующие циклы будут описывать методы и структуру движка и будет уже предназначен для более профессиональной аудитории. В приведённых статьях будет взят примером игровой движок GreenRay Engine (впоследствии будет называться сокращенно GRE) моей собственной разработки, далее он будет выкладываться блоками всё в новых и новых статьях (всё будет полностью открытым кодом - OpenSource, никаких вызовов из библиотек, что как правило присуще коммерческим версиям движков), так что можно будет его обсуждать и коллективно его дорабатывать, вносить изменения и дополнения, можно даже критиковать, только не очень сильно, т.к это всё делается и приводится в качестве примера, и я сам пока не являюсь профессиональным программистом в области программирования 3D и буду учиться вместе с вами. Примечание! Сразу стоит оговориться разработка движка будет вестись в среде Visual Studio 2005 (v8.0) в связке C++ и DirectX 9.0c и будут рассматриваться аспекты связанные только с разработкой и программированием GRE, создание моделей, текстур и прочее в данных статьях рассматриваться не будут этим занимаются другие разработчики из нашей команды, так, что все вопросы связанные с моделированием или Photoshop будут адресовываться именно им (Master Lucky и Zerg). Все обсуждения, дополнения, критику, отловленные баги (а они будут ![]() предлагаю вести в отдельных топиках, а затем дополненную и обработанную информацию я буду дополнять в самих статьях (пока так, а потом посмотрим как далее пойдёт) Так что все желающие прошу присоединяться!!! ![]() Итак начнём: Часть 1. Подготовка к разработке. 1.1. Описание возможности движка. Сначала опишем, что уже включает и умеет сам движок GRE версии 3.0 (версию 2.0 разбирать не будем, т.к изначально он разрабатывался на Delphi): 1. Поддержка довольно большого кол-ва полигонов (максимально тестируемое пока было 300 тыс. полигонов при этом fps (Frames Per Second) - кол-во кадров в секунду) даже не менялось, в принципе я считаю, что при таком кол-ве можно смоделировать неплохой по размерам городской квартальчик (игру GTA (первая часть) в расчёт не берём каково там кол-во полигонов было я не знаю!) 2. Поддержка шейдеров версии 2.0 и 3.0 (освещение по Фонгу) 3. Используется уже готовый физический движок от NVidia PhysX (ранее принадлежал Ageia PhysX а до этого вообще был платный и назывался Novodex до сих пор многие операторы и процедуры начинаются с аббревиатуры Nx, но об этом позже когда будем разбирать сам физический движок) 4. Поддержка аудио библиотек и воспроизведение mp3 5. Управление и камера от первого лица с использованием DirectInput 6. Небольшой пользовательский "интерфейсик" с полупрозрачными окнами, и вырезанием окон различной формы по маске одного цвета (естественно слово "окно" здесь должно звучать утрировано, т.к никаких окон в 3D не существует их нужно эмулировать самому, обычно это отрисовка полигона во ViewPorte или некоторые применяют Sprites, я выбрал отрисовку полигона). Примечание! Полигон - это весьма абстрактное понятие, обычно служит для визуализации 3D объекта в пространстве и являются составным обычно состоит из треугольников, соответственно сам треугольник состоит из 3х вершин, затем 3D Render объединяет эти вершины в результате на экране мы видим "цельный" треугольник залитый так сказать пикселями (точками) одного или более цветами, на пиксельном уровне уже обычно работают через шейдеры (ретушь, закраска), (в принципе используя шейдеры полигон можно закрасить и разными цветами) о шейдерах будем рассказывать позже. 7. Отрисовка небесного куба – SkyBox. Создание иллюзии большого пространства, как бы общее окружение облака, горы и прочее.. (позже попробуем разобраться с весьма интересной технологией 3D SkyBox суть его заключается в проецировании уменьшенной фоновой декорации с использованием уменьшенных 3D моделей в реальную сцену окружения, при помощи специальной проецирующей камеры, в рез-те чего создаётся иллюзия огромнейших игровых пространств или больших возвышающихся объектов с применением относительно малого кол-ва полигонов, данная технология впервые была реализована разработчиками в игре Half-Life 2) 1.2. Самое начало.. Далее, что следует разобрать это структуру игрового движка, т.е из чего он состоит и с чего начинает программист взявшись за его разработку. Примечание! Вообще данный раздел содержит пример простейшего создания проекта в среде разработки Visual Studio и предназначен для самых самых новичков, тех кто вообще ничего не смыслит в программировании и считаю, что по приведённому здесь материалу с иллюстрациями в два счёта можно создать новый проект, единственное требование это наличие всех необходимых материалов и средств для разработки – это Visual Studio, DirectX SDK 9.0c и NVidia PhysX.. Итак, приступим: 1) Для начала устанавливаем среду Visual Studio 2005 (у кого нет желательно "приобрести", также подойдёт и более новая версия VS 2008): ![]() Убираем всякую лишнюю "лабуду" в то время как программа установки спросит какие компоненты нужно установить, оставляем только то, что указано на рисунке ниже: ![]() Примечание ! Maintenance Mode у меня потому, что Visual Studio на момент написания статьи уже было установлено на моём компьютере, у вас может быть и по другому. Далее после того как завершится установка Visual Studio устанавливаем DirectX SDK. 2) Устанавливаем DirectX 9.0 (я пока использую версию DirectX 9.0c April 2005, т.к более устойчивая да и менее глючная (в процессе разработки движка в более новых версиях были выявлены некоторые баги) но в последствии придётся всё же использовать новую версию DX если планируется двигаться дальше вместе с прогрессом и осваивать DX 10 ![]() ![]() ![]() 3) Скачиваем с сайта NVidia физический движок PhysX и устанавливаем его: Сначала желательно установить так называемое системное программное обеспечение необходимое для нормального функционирования физического движка для этого придётся скачать файл под названием PhysX_8.10.13_SystemSoftware.exe и установить его: ![]() После этого скачиваем файл PhysX_2.8.1_SDK_Core.msi (это PhysX SDK собственной персоной) и устанавливаем его: ![]() 4) Создаём новый проект, для этого запускаем Visual Studio и заходим в меню File->New->Project… как показано на рисунке ниже: ![]() В появившемся окне выбираем Project types (тип проекта) – General, Templates (шаблоны) – Empty Project, Name (имя проекта) – GRDebugger, Location (месторасположение папки с проектом) – выбираем любое нажав на кнопку Browse (у меня GreenRay), убираем галочку с Create directory for solution, короче говоря делаем всё в точности как показано на рисунке ниже: ![]() Все теперь мы создали совершенно новый пустой проект под названием GRDebugger (имя файла проекта называется GRDebugger.sln этот sln – файл сокращённо от Solution является базовым запустив его по клику мыши мы тут же мгновенно запустим наш проект для отладки и компоновки). Всё поехали дальше.. 5) Прописываем пути для заголовочных файлов и библиотек: Данная операция необходима для того, чтобы среда Visual Studio понимала и знала во первых где находится само DirectX SDK (SDK – Software Developers Kit) ну и соответственно где находится необходимый для работы DirectX-овский "бутор" это различные заголовочные header (*.h) и *.cpp (C++) файлы, все вызовы идут через них и основным промежуточным звеном является либы (*.lib файлы) это двоичные файлы необходимые для взаимодействия между API-кодом нашей программы и ядром DirectX (Сами файлы ядра находятся в папке Windows\System32 в виде динамических библиотек и имеют имена типа d3d9.dll, d3dx9_36.dll и др. разные имена. Код данных библиотек не доступен никому (кроме самой компании Мелкософт конечно которая их и разрабатывает), мы можем лишь использовать или вызывать из них необходимые нам функции, но не смотреть, а тем более редактировать их, это относится не только к DirectX SDK, но и к PhysX SDK тоже да и вообще к любому виду SDK. Как прописывать подобные библиотеки будет описано ниже в п.7) Заходим в меню Tools->Options ![]() В появившемся окне слева в списке раскрываем дерево Projects and Solutions и выбираем VC++Directories, затем сверху из выпадающего списка Show directories for: необходимо выбрать Library files здесь как раз и будет прописан путь к нашим либам для этого нажимаем на пустом месте мышью где находятся другие прописанные пути необходимые среде Visual Studio, и нажимаем на кнопку с троеточием и выбираем путь к папке с либами, у меня по умолчанию путь: C:\Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Lib\x86 У вас путь может быть другой в зависимости от версии установленного SDK, обычно по умолчанию он устанавливается в Program Files. Важно! Данный путь должен быть прописан в самом верху списка т.е до списка уже имеющихся там путей, для этого выделяем наш прописанный путь мышью затем нажатием на стрелку вверх перемещаем данный путь в самый верх списка, если этого не сделать то это будет вызывать ошибку во время компиляции проекта. Смотрим рисунок ниже: ![]() Примечание ! Иногда возникает ситуация когда программа установки DirectX SDK автоматически находит и сама прописывает пути в среде Visual Studio их нужно удалить и всё равно прописать или указать вручную, будьте внимательны это очень важный момент !!! Примечание ! Если заметить, то выше был указан путь к 32х разрядным версиям библиотек, но счастливые обладатели 64х разрядных систем могут указать путь и к 64х разрядным версиям библиотек !! Путь тогда будет выглядеть уже следующим образом: C:\Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Lib\x64 Также аналогичным образом прописываем пути к заголовочным (*h – файлам и *cpp), выбираем из выпадающего списка под названием Show directories for: Include files и прописываем или указываем путь: C:\Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Include ![]() И нажимаем ОК Добавлено @ 14:12 6) Прописываем пути для заголовочных файлов и библиотек PhysX SDK: Аналогичным образом как описано выше прописываем пути к PhysX SDK для Library files Путь будет выглядеть следующим образом: C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\lib\Win32 Для Include files будет несколько путей: C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Cooking\include C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Foundation\include C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\NxCharacter\include C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Physics\include C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Physics\include\cloth C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Physics\include\fluids C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\Physics\include\softbody C:\Program Files\NVIDIA Corporation\NVIDIA PhysX SDK\v2.8.1\SDKs\PhysXLoader\include ![]() Нажимаем кнопку ОК. Всё PhysX SDK прописан.. 7) Прописываем необходимые Libraries (Lib-библиотеки): Это необходимо для дальнейшей компиляции и разработки самого движка, поэтому пропишем их все и сразу, чтоб в дальнейшем к ним не возвращаться и не акцентировать на них своё внимание, для этого заходим в меню Project->GRDebugger Properties… или нажимаем комбинацию клавиш Alt+F7 ![]() В появившемся окне в раскрывающемся "дереве" выбираем Configuration Properties->Linker->Input далее нажимаем мышью на пункте Additional Dependencies в поле появится кнопка с троеточием для выбора подключаемых библиотек см. рисунок ниже: ![]() В окне Additional Dependencies прописываем через пробел или нажимаем Enter после каждой библиотеки: Список необходимых библиотек: d3d9.lib d3dx9.lib d3dx9d.lib d3dxof.lib dinput.lib dinput8.lib dxguid.lib winmm.lib dsound.lib strmiids.lib PhysXLoader.lib ![]() После того как все либы (*.lib) прописаны нажимаем OK. В принципе библиотеки можно было бы прописать и в теле программы, используя конструкции типа:
Я выбрал способ непосредственной интеграции библиотек в "тело" проекта. Теперь, что касается strmiids.lib остутствие её будет вызывать ошибку после процесса компиляции данная либа не прилагается в поставке DirectX SDK, её можно взять из файла: Sound_Modules.rar в самом низу статьи. После, того как вы скачаете этот файл его нужно разархивировать в папку: C:\GreenRay\GRDebugger\Sound_Modules\Lib Этот lib-файл будет необходим нам в будущем во время реализации функции проигрывания mp3-файлов в движке, также нужно скачать раздел Common для работы со звуком он частично взят из раздела DirectShow (были взяты только файлы необходимые для работы с mp3), находится в том же файле: Sound_Modules.rar Раздел Common нужно разархивировать в папку: C:\GreenRay\GRDebugger\Sound_Modules\Common Теперь нужно прилинковать эти файлы к среде Visual Studio, делаем, это точностью также как мы поступали с DirectX SDK и PhysX SDK. Заходим в меню Tools->Options, в появившемся окне Options из списка слева раскрываем Projects and Solutions и выбрать VC++Directories, далее из выпадающего списка Show directories for: выбираем Library files и прописываем путь куда мы ранее разархивировали файл strmiids.lib, он должен быть в папке C:\GreenRay\GRDebugger\Sound_Modules\Lib ![]() Дальше прописываем путь к ранее скачанной папке Common, аналогично только в выпадающем списке Show directories for: выбираем Include files: и прописываем путь C:\GreenRay\GRDebugger\Sound_Modules\Common ![]() Нажимаем кнопку ОК. Всё все необходимые либы у нас есть и прописаны. Часть 2. Проектирование игрового движка. 2.1. Создание игрового полотна. Под таким страшным названием скрывается обычное создание виндового (Windows) окна, которое будет служить "подложкой" для вывода и отрисовки трёхмерного пространства и всей графики и игровой сцены в целом. 1) Сначала создадим файл Form_Layer.cpp (в принципе название может быть и любое другое, на ваше усмотрение, но всё же советую создавать все модули с названиями как у меня, иначе впоследствии потеряем все связки, да и вообще потом получится "каша" особенно в разделе #include я буду приводить код с одним названием модуля, а у вас будет называться по другому, в прочем ваше дело ![]() Для этого в "дереве" нашего проекта выбираем Source Files и нажимаем на нём правой кнопкой мыши, далее из выпадающего меню выбираем Add->New Item… ![]() В появившемся окне New Item в колонке Categories: выбираем пункт Code, в Templates выбираем C++ File (.cpp), в строке Name: прописываем имя файла Form_Layer, Создадим папку под названием Engine_Modules где будут храниться модули и исходные коды самого движка, так удобнее, для этого заходим в папку где находится наш ранее созданный проект, она должна быть по пути C:\GreenRay\GRDebugger\ и в ней создаём папку Engine_Modules, затем возвращаемся к Visual Studio в строке Location: указываем местоположение где будет находиться этот файл. Необходимо, чтобы он создался в папке Engine_Modules поэтому в строке Location: будет путь C:\GreenRay\GRDebugger\Engine_Modules см. рисунок ниже: ![]() Всё нажимаем кнопку Add Теперь таким же образом нужно создать заголовочный Header File (.h), для этого также в "дереве" проекта нажимаем правой кнопкой на Header Files и выбираем Add->New Item.. В появившемся окне New Item в колонке Categories: выбираем пункт Code, в Templates выбираем Header File (.h), в строке Name: также прописываем имя файла Form_Layer, Location: остаётся тот же без изменений C:\GreenRay\GRDebugger\Engine_Modules Всё снова нажимаем кнопку Add. У нас появилось в "дереве" нашего проекта два файла – файл содержащий код .cpp и заголовочный файл .h содержащий вызовы процедур или функций и прочие параметры необходимые для работы всего проекта в целом. Но для нормального взаимодействия между файлом кода .cpp и .h его нужно прописать в среде Visual Studio, тут ничего нового заходим в меню Tools->Options в окне Options из списка выбираем Project and Solutions->VC++Directories и в выпадающем списке Show directories for: выбираем Include files и добавляем туда путь C:\GreenRay\GRDebugger\Engine_Modules ![]() Нажимаем ОК, файлы прилинкованы к проекту. Всё вся эта канитель завершена, небось уже поднадоела вся эта процедура по собиранию и компоновке движка ? ![]() Ок теперь всё скомпоновано, среда Visual Studio настроена, и можно начинать полноценное программирование.. 2) Создание полотна для вывода графики. Возвращаемся к "дереву" нашего проекта, делаем двойной щелчок мыши на файле Form_Layer.cpp перед нами появится пустой экран где можно вводить код. Вот вам домашнее задание: Необходимо создать окно на Win API, и продумать методы и процедуры инициализации Direct3D, определить, какие возможности поддерживает ваша видеокарта…. Шутка ![]() Копируем и вставляем этот код в ваше пустое окно файла Form_Layer.cpp:
Теперь делаем двойной щелчок мыши в "дереве" проекта на файле Form_Layer.h Код у него будет следующим:
Не забываем после этого нажать кнопку сохранить, пробуем скомпилировать проект, нажав на зелёную стрелку вверху окна Visual Studio: ![]() Если процесс компиляции завершился ошибкой то внизу окна рабочей среды выводится окно отладки содержащее информацию об ошибке, где можно отладить или устранить причину ошибки, двойным кликом мыши по надписи с ошибкой среда программирования как правило позиционирует и устанавливает курсор на участке кода вызвавшего эту ошибку, обычно она выводится в окне Output: ![]() Если же процесс компиляции прошёл нормально, то перед нами должно появиться окно как на рисунке представленном ниже: ![]() Поздравляю вы совершили первый шаг по созданию вашего игрового движка. Двигаемся дальше.. 3) Инициализируем Direct3D: В "дереве" нашего проекта нажимаем правой кнопкой мыши на Header Files в появившемся меню выбираем Add->New Item далее в окне Categories: Выбираем категорию Code, в окне Templates: выбираем Header File (.h), далее в поле Name: вводим GR_Engine, а в поле Location: указываем путь к папке C:\GreenRay\GRDebugger\Engine_Modules В общем выполняем все те же действия, что мы и делали ранее когда создавали файл модуля Form_Layer, кто уже забыл читаем Часть 2 п.2.1. Далее снова в "дереве" нашего проекта нажимаем правой кнопкой мыши уже на Source Files в появившемся меню выбираем Add->New Item далее в окне Categories: Выбираем категорию Code, в окне Templates: выбираем С++ File (.сpp), далее в поле Name: вводим GR_Engine, а в поле Location: указываем путь к папке C:\GreenRay\GRDebugger\Engine_Modules Всё теперь в "дереве" нашего проекта к существующим Form_Layer.h и Form_Layer.cpp добавилось ещё два файла под названием GR_Engine.h и GR_Engine.cpp соответственно. Делаем двойной щелчок в "дереве" проекта на файле Form_Layer.h, стираем у него всё содержимое и меняем на это:
Потом делаем двойной щелчок на файле Form_Layer.cpp также удаляем всё его содержимое и меняем на это:
Тут же быстренько нажимаем на GR_Engine.h и вставляем это:
Это сообщение отредактировал(а) php - 5.9.2014, 07:07 --------------------
Джедаи не пройдут.. |
||||||||||||
|
|||||||||||||
php |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Теперь снова нажимаем на GR_Engine.cpp и вставляем следующий код:
Не забываем сохраниться, затем компилируем наш проект, в итоге должно появиться уже не белое как ранее, а чёрное окно как на рисунке: ![]() Это говорит, что наше Direct3D устройство нормально создалось и инициализировалось, Так как происходит очистка заднего буфера, то экран становится чёрным, в принципе можно "поиграться" с цветом заднего буфера, его цвет задаётся в строке:
В параметре: D3DCOLOR_XRGB(0,0,0) – это RGB палитра, так, что к примеру выставление параметра D3DCOLOR_XRGB(255,0,0) приведёт к заливке экрана красным цветом, величина 255 это интенсивность цвета и лежит в пределах от 0..255. Всё! заготовка ("болванка" так сказать) нашего игрового движка полностью готова, на её основе можно полноценно дальше создавать игру, добавляя все новые и новые возможности. В последующих частях мы продолжим разбирать движок GRE, "прикрутим" к нему игровую камеру, загрузим высокополигональную модель, добавим освещение и SkyBox. Продолжение следует.. _________________________________________________________________________ © Digital Dreams Development Inc., 2009 (С) GR-Engine Technical Documentation. Любая публикация изложенного материала только с разрешения автора. Это сообщение отредактировал(а) php - 5.9.2014, 07:11 --------------------
Джедаи не пройдут.. |
||||
|
|||||
net968 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 13.2.2009 Репутация: нет Всего: нет |
жду с нетерпением продолжения.Респект тебе
![]() |
|||
|
||||
LVI |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 25.3.2009 Репутация: нет Всего: нет |
В последней версии Microsoft DirectX SDK нет библиотнки "dinput.lib" осталась только "dinput8.lib",
поэтому для нормальной компиляции ее нужно убрать из списка добавляемых библиотек. |
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Ок спасибо за поправку!
--------------------
Джедаи не пройдут.. |
|||
|
||||
pirat77 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 10.11.2008 Репутация: нет Всего: нет |
Спасибо за урок
![]() ![]() |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
||||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
php, молоток, неплохо расписал
![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Master Lucky |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.1.2008 Где: Торонто, Канада Репутация: нет Всего: нет |
Макс, клёва, продолжай в том же духе! Такими темпами скоро мы с тобой уже и игрушку свою забабахаем!
![]() Добавлено через 3 минуты
А ты попробуй без комментов в коде разобраться...... |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Каждый день ![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
Вот это странный код
|
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Цитата:
Вот это странный код код C++ 1: 2: 3: 4: 5: 6: 7: 8: if (m_pDirect3D==NULL)//if (!m_pDirect3D) { if (m_pDirect3D != NULL) //это зачем ? эсли словие ни когда не сработает! m_pDirect3D->Release(); // MessageBoxA(NULL,"GR_Engine.cpp: Failed To Create Direct3D Interface..", "GreenRay Engine Error",MB_SYSTEMMODAL|MB_ICONERROR); m_pResult = E_FAIL; } ![]() ISergeyN Вы пред тем что до этого идет хоть удосужились прочитать? Добавлено через 13 минут и 52 секунды Master Lucky, да я соббсно могу код вообще без комментариев выкладывать мне же легче будет, но смысл тогда всего этого и этой затеи вообще?, так что ваше замечание абсолютно верно - поддерживаю! --------------------
Джедаи не пройдут.. |
|||
|
||||
ISergeyN |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
Та вроде нет.
|
||||
|
|||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
А вы уверены, что в результате ошибки функция Direct3DCreate9(D3D_SDK_VERSION) вернёт
значение NULL я лично не уверен! --------------------
Джедаи не пройдут.. |
|||
|
||||
ISergeyN |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
Уверен. В справке по DirectX
|
||||||
|
|||||||
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, а стандартная документация чем плоха?
|
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Ну к примеру вот это: http://www.intuit.ru/department/graphics/direct3dhlsl/
довольно неплохо расписано начиная с самых азов и заканчивая шейдерами, это не совсем книга конечно это статьи с описанием и картинками, а вообще рекомендую искать и читать в интернете различные статьи, в книгах бывает порой слишком "мутно" всё расписано, а здесь допустим ищем конкретно интересующую тему к примеру "Работа с освещением в DirectX" читаем обрабатываем статью и уже методом подбора в коде меняем те или иные функции, значения, смотрим, что за что отвечает, да вот даже можно взять само DX SDK в папке Samples есть примеры с программным кодом и описанием правда на английском языке.. --------------------
Джедаи не пройдут.. |
|||
|
||||
Eviljoker |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
php респек, не так часто подиректу нахожу толковые вещи еще и с таким подробным описанием!
Я щитаю себя новичком... пару книг канешн прочитал и в часности Андре Ламота(ну ет по графике вообще) компиляция и запуск написаного проекта затруднений никаких не вызывает, все скомпилилось с первого раза, впринцыпе как и разбор кода... ваще в нете просто искал статью как SkyBox сделать, хорошо что на етот форум забрел ![]() |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
скажите кто нить плиз это по первой части урока где надо инициализовать Direct3d я всёправельно сделал как написано но вылетеет вот такая ошибка когда я запускаю
1>***.obj : error LNK2019: ссылка на неразрешенный внешний символ _Direct3DCreate9@4 в функции "long __cdecl CreateDirect3D(struct HWND__ *)" (?CreateDirect3D@@YAJPAUHWND__@@@Z) 1>C:\***\***\Debug\***.exe : fatal error LNK1120: 1 неразрешенных внешних элементов 1>Журнал построения был сохранен в "file://c:\***\****\Debug\BuildLog.htm" Добавлено через 14 минут и 40 секунд И ещё один вопрос это будет игровой движок например как blitzt 3d или Quest 3d или уже игра Это сообщение отредактировал(а) Kolt007 - 24.8.2009, 16:25 |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
ответ те плиз
|
|||
|
||||
php |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Будем стараться делать полноценную игру, хоть это и будет нелегко..
Какая у вас установлена версия DX DSK? --------------------
Джедаи не пройдут.. |
||||
|
|||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
У меня DX 10
Всмысле это будет не движок на котором можно создавать игры А сразу игра написаная на c++ Ну вот есть unity 3d через него можно создавать игры без c++ а здесь будет так что вся игра будет писатся на с++ да Это сообщение отредактировал(а) Kolt007 - 28.8.2009, 15:12 |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Я вообще не знаю у меня и на dx 9 который здесь используется та же самая ошибка
![]() Это сообщение отредактировал(а) Kolt007 - 2.9.2009, 13:44 |
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Да игра будет делаться с использованием языка C++ и DirectX,
т.е непосредственно сам движок игры, а то что касается unity 3d то это судя по описанию игровое SDK уже или конструктор! Здесь по сути тот же конструктор, но только код и движок игры можно переписывать и настраивать на любой лад как хочешь, добавлять, изменять в общем как говорится была бы фантазия!! Кстати, а какая версия VisualStudio у вас используется ? Проверьте также все ли библиотеки lib правильно прописаны, проверьте пути к модулям движка может что-то там неправильно прописано, как это делается достаточно подробно описано в самом начале статьи! --------------------
Джедаи не пройдут.. |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
У меня visual studio 2008 библиотеки вроде норм прописаны
|
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Эта проблема решена я просто библиотеки для x86 сейчас поставил а было x64 хотя винда 64 , но когда я хочу инициализовать d3d 10 то не получается по тутору в dx не че не понятно но я так понимаю код придётся переписывать
|
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Не получается потому, что структура и инициализация в DX10 изменена и отличается от DX9, совершенно верно код придётся полностью переписывать и "портировать" уже под DX10 ![]() Займётесь? ![]() --------------------
Джедаи не пройдут.. |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Займусь , а можно сделать так что бы был и dx 9 и dx 10
Это сообщение отредактировал(а) Kolt007 - 11.9.2009, 16:05 |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
А переписывать всё или только код где инициализация
|
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
||||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Да это можно сделать, вопрос лишь состоит в том как это реализовать, к примеру можно сделать какой нибудь загрузчик с выбором какую версию DX мы хотим использовать, допустим перед самой загрузкой движка и графики выбирать 9 или 10 DirectX, по сути таким "макаром" можно и поддержку 8 го туда запихнуть ради прикола! ![]() --------------------
Джедаи не пройдут.. |
|||
|
||||
zvad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
а продолжение будет?
![]() |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
C инициализацией DX 10 я разобрался, но дальше как сделать камеру и загрузить модель не где не написано в DX 9 хоть .x файлы загружались а здесь какие то SDKMesh что ли
И еще когда выйдет следущая часть урока |
|||
|
||||
SATANAblack |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 29.10.2009 Где: Украина Репутация: нет Всего: нет |
php - большое спасибо за уроки и детальное коментирование. Я щас только вхожу в азы и розбираю семплы на SDK DirectX. Но скоро перейду на ваши уроки.
|
|||
|
||||
shuttle |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
Структура которая описывает вершину skybox-а
Затем создаем массив этих вершин.
Создание нормалей и color-а отсутствуют. Куда они пропали? --------------------
|
||||
|
|||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
А зачем вам нормали при создании SkyBox ?
--------------------
Джедаи не пройдут.. |
|||
|
||||
shuttle |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
А они там разьве не нужны? Если же и не нужны то и не и нужно было их в струтуре SKYBOX_VERTEX объявлять. И самое главное - нужно продолжение сновного урока - а именно работа с физическим движком. --------------------
|
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Да это я для отладки и тестов всяких делал давно ещё осталось, думал, что пригодится.. Надо будет убрать лишнее всё таки... Спасибо что заметили! ![]() Продолжение уроков будет обязательно, сейчас только чуть чуть разрулю со своими делами немного, а то у меня параллельно ещё два проекта идёт просто.. ![]() --------------------
Джедаи не пройдут.. |
|||
|
||||
Kolt007 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 24.8.2009 Репутация: нет Всего: нет |
Помогите со создание SkyBox'a мне пишет ошибки в файле GRSkyBox.cpp:
CGRSkyBox::CGRSkyBox повторное объявление функции не разрешается CGRSkyBox::~CGRSkyBox повторное объявление функции не разрешается CGRSkyBox::Release повторное объявление функции не разрешается {: отсутствует заголовок функции (возможно, используется формальный список старого типа) CGRSkyBox::SetTextures повторное объявление функции не разрешается {: отсутствует заголовок функции (возможно, используется формальный список старого типа) хотя всё сделал правельно как показано Это сообщение отредактировал(а) Kolt007 - 15.11.2009, 13:11 |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Модератор: Если хотите обсудить какой-то вопрос - создавайте тему. Здесь же только статья.
Это сообщение отредактировал(а) Rickert - 15.11.2009, 17:25 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
shuttle |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
Сделал все шаги, что то fps получилось всего ~60 (8400 GS, 512). Вроде как маловато fps, может кто еще измерил, какие у кого значения получились?
--------------------
|
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Да счётчик значения там выдаёт не совсем верный результат, точнее идёт некая привязка к частоте развёртки экрана монитора, к примеру допустим если у вас развёртка стоит 80 Hz то fps уже будет примерно от 80 до 84, если 60 Hz то соответственно 60-65 fps, в общем тут тоже нужна будет переделка счётчика немного не те данные выдаёт..
--------------------
Джедаи не пройдут.. |
|||
|
||||
rdmt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 2.2.2010 Репутация: нет Всего: нет |
всем привет!
как сделать так чтоб картинки показывались?? а то пишет user posted image и ###... вот решил научится попрогать, а без некоторых картинок, становятца не понятны, не которые моменты :(((( |
|||
|
||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Картинки были загружены год назад и уже, по видимому, сдохли. Попробуйте автору статьи написать.
Вообще там все очнь подробно описано, вполне можно и без картинок повторить. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
vkd |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 19.2.2010 Репутация: нет Всего: нет |
А продолжения можно ожидать? А то думаю, стоит ли присоединяться к компании....
Сам по книжкам сейчас пытаюсь смастерить движок. Книжки, правда уже устаревшие, на Студии 2008 примеры их не собираются, вот и набрел на ваше обсуждение. Смущает, правда, большое количество подключаемых библиотек. Хотелось бы самому все по крупицам собрать. Но если продолжение будет, я с радостью тоже поучаствую в общем деле! |
|||
|
||||
mmmaaaxxx15 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 20.7.2011 Репутация: нет Всего: нет |
помогите проблема
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ _Direct3DCreate9@4 в функции "long __cdecl CreateDirect3D(struct HWND__ *)" (?CreateDirect3D@@YAJPAUHWND__@@@Z) Ошибка 2 error LNK1120: 1 неразрешенных внешних элементов код скопировал как написано ! Это сообщение отредактировал(а) mmmaaaxxx15 - 20.7.2011, 14:10 |
|||
|
||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
mmmaaaxxx15
либы подключил к проекту? Это сообщение отредактировал(а) Чупакабро - 22.7.2011, 16:42 --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Статья на доработке..
Это сообщение отредактировал(а) php - 31.5.2013, 15:47 |
|||
|
||||
Snake006 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 3.2.2012 Репутация: нет Всего: нет |
А продолжение будет?
|
|||
|
||||
Snake006 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 3.2.2012 Репутация: нет Всего: нет |
Почему, когда я увеличиваю размер скайбокса, начинает появляться темнота, и чем дальше я передвигаюсь, тем темнота больше?
|
|||
|
||||
lokod |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.2.2012 Где: Красноуральск Репутация: нет Всего: -1 |
А ссылочка на топик?
Я только нашел этот урок ![]() ![]() |
|||
|
||||
Ineigo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
Можно попросить автора перезалить картинки..?
С уважением Михаил! |
|||
|
||||
php |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 20.2.2003 Репутация: 3 Всего: 3 |
Статья на доработке..
Это сообщение отредактировал(а) php - 31.5.2013, 15:47 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |