Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование игрового движка GR-Engine, Введение 
:(
    Опции темы
php
Дата 10.2.2009, 14:11 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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).

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

Так что все желающие прошу присоединяться!!! smile

Итак начнём:

Часть 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):

user posted image

Убираем всякую лишнюю "лабуду" в то время как программа установки спросит какие компоненты нужно установить, оставляем только то, что указано на рисунке ниже:

user posted image

Примечание ! Maintenance Mode у меня потому, что Visual Studio на момент написания статьи уже было установлено на моём компьютере, у вас может быть и по другому.

Далее после того как завершится установка Visual Studio устанавливаем DirectX SDK.

2) Устанавливаем DirectX 9.0 (я пока использую версию DirectX 9.0c April 2005, т.к более устойчивая да и менее глючная (в процессе разработки движка в более новых версиях были выявлены некоторые баги) но в последствии придётся всё же использовать новую версию DX если планируется двигаться дальше вместе с прогрессом и осваивать DX 10 smile так, что можно устанавливать и более новую версию это на разработку движка никак не повлияет:

user posted image

user posted image

3) Скачиваем с сайта NVidia физический движок PhysX и устанавливаем его:
Сначала желательно установить так называемое системное программное обеспечение необходимое для нормального функционирования физического движка для этого придётся скачать файл под названием PhysX_8.10.13_SystemSoftware.exe и установить его: 

user posted image

После этого скачиваем файл PhysX_2.8.1_SDK_Core.msi (это PhysX SDK собственной персоной) и устанавливаем его:

user posted image

4) Создаём новый проект, для этого запускаем Visual Studio и заходим в меню File->New->Project… как показано на рисунке ниже:

user posted image

В появившемся окне выбираем Project types (тип проекта) – General, Templates (шаблоны) – Empty Project, Name (имя проекта) – GRDebugger, Location (месторасположение папки с проектом) – выбираем любое нажав на кнопку Browse (у меня GreenRay), убираем галочку с Create directory for solution, короче говоря делаем всё в точности как показано на рисунке ниже:

user posted image

Все теперь мы создали совершенно новый пустой проект под названием 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

user posted image

В появившемся окне слева в списке раскрываем дерево 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.

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

user posted image

Примечание ! Иногда возникает ситуация когда программа установки 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

user posted image

И нажимаем ОК

Добавлено @ 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


user posted image

Нажимаем кнопку ОК. Всё PhysX SDK прописан..

7) Прописываем необходимые Libraries (Lib-библиотеки):
Это необходимо для дальнейшей компиляции и разработки самого движка, поэтому
пропишем их все и сразу, чтоб в дальнейшем к ним не возвращаться и не акцентировать на них своё внимание, для этого заходим в меню Project->GRDebugger Properties… или нажимаем комбинацию клавиш Alt+F7

user posted image

В появившемся окне в раскрывающемся "дереве" выбираем Configuration Properties->Linker->Input далее нажимаем мышью на пункте Additional Dependencies в поле появится кнопка с троеточием для выбора подключаемых библиотек см. рисунок ниже:

user posted image

В окне 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

user posted image

После того как все либы (*.lib) прописаны нажимаем OK.

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

#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")



Я выбрал способ непосредственной интеграции библиотек в "тело"  проекта.

Теперь, что касается 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

user posted image

Дальше прописываем путь к ранее скачанной папке Common, аналогично только в выпадающем списке Show directories for: выбираем Include files: и прописываем путь
C:\GreenRay\GRDebugger\Sound_Modules\Common

user posted image

Нажимаем кнопку ОК. 
Всё все необходимые либы у нас есть и прописаны.

Часть 2. Проектирование игрового движка.

2.1. Создание игрового полотна.
Под таким страшным названием скрывается обычное создание виндового (Windows) окна, которое будет служить "подложкой" для вывода и отрисовки трёхмерного пространства и всей графики и игровой сцены в целом.

1) Сначала создадим файл Form_Layer.cpp (в принципе название может быть и любое другое, на ваше усмотрение, но всё же советую создавать все модули с названиями как у меня, иначе впоследствии потеряем все связки, да и вообще потом получится "каша" особенно в разделе #include я буду приводить код с одним названием модуля, а у вас будет называться по другому, в прочем ваше дело smile) моё дело предупредить)

Для этого в "дереве" нашего проекта выбираем Source Files и нажимаем на нём правой кнопкой мыши, далее из выпадающего меню выбираем Add->New Item…

user posted image

В появившемся окне 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 см. рисунок ниже:

user posted image

Всё нажимаем кнопку 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

user posted image

Нажимаем ОК, файлы прилинкованы к проекту.

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

Ок теперь всё скомпоновано, среда Visual Studio настроена, 
и можно начинать полноценное программирование..

2) Создание полотна для вывода графики.
Возвращаемся к "дереву" нашего проекта, делаем двойной щелчок мыши на файле Form_Layer.cpp перед нами появится пустой экран где можно вводить код. 

Вот вам домашнее задание: Необходимо создать окно на Win API, и продумать методы и процедуры инициализации Direct3D, определить, какие возможности поддерживает ваша видеокарта…. Шутка smile..

Копируем и вставляем этот код в ваше пустое окно файла Form_Layer.cpp:

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine Debugger Module v.3.0.0.1
// Form_Layer.cpp Visual Studio 8 Version.
// It's An GreenRay Form_Layer Source File.
// Made Specially For Check And Debugging 3DEngine.
/*****************************************************************************/
#define STRICT //Обеспечивает переносимость кода, к примеру мы прогу пишем на другой
//винде 16-разрядной, а объявление этого параметра позволит избежать многих ошибок при 
//компиляции уже под 32 разрядной ОС и наоборот.
//Использование STRICT позволяет: 
//1) выполнять строгую проверку типов; 
//2) корректировать и согласовывать описания типа параметра и возвращаемого значения; 
//3) создавать прототипы определений типов для функций обратного вызова (оконные, диалоговые и специальные процедуры); 
//4) согласовывать с ANSI описания структур COMM, DCB и COMSTAT. 
//ну и многое другое, не будем уже углубляться в эти программистские Debri.

#define WIN32_LEAN_AND_MEAN //Позволяет обойти ошибки множественного объявления 
//структур при подключении заголовочных файлов уже имеющих эти структуры. 

#include "Form_Layer.h" //Объявляем здесь наш заголовочный Header-файл

////////////////////////////////////////////////////////////////////////////////
// External Definitions And Prototypes 
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProcessing(HWND Hndl_Wnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);

//-----------------------------------------------------------------------------
// Name: WindowProcessing()
// Desc: Здесь обрабатываются оконные сообщения
//-----------------------------------------------------------------------------
LRESULT CALLBACK WindowProcessing(HWND Hndl_Wnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
  switch(Msg)
  {
    case WM_KEYDOWN:
    {
      if (wParam == VK_ESCAPE) //Перехватили нажатие кнопки Esc на клавиатуре
      {
        PostQuitMessage(0); break; //Обрабатываем
      }
    }
    break;

    case WM_CLOSE: //Перехватили момент закрытия окна при нажатии на крестике в углу экрана 
    {
      PostQuitMessage(0); //Обрабатываем
    }
        
    case WM_DESTROY: //Перехватили момент закрытия окна через трей или диспетчер задач Windows
    {
      PostQuitMessage(0); //Обрабатываем
    }
    break;

    default:
    {
      return DefWindowProc(Hndl_Wnd,Msg,wParam,lParam); //А иначе продолжаем обрабатывать сообщения
    }
    break;
  }
  return 0;

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

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Эта функция предназначена для создания нашего окна
// Это является точкой входа для нашего приложения, иначе в процессе компиляции
// вернётся сообщение об ошибке: Entry point must be defined.
//-----------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
  WNDCLASSEX WindowClass; //Структура необходимая для регистрации оконного класса 
  MSG uMsg; //Оконные сообщения
  HWND Hndl_Wnd = NULL; //Дескриптор оконного класса

  int FormWidth = 640; //Ширина нашего окна 
  int FormHeight = 480; //Высота нашего окна
  LPCSTR FormCaption = "GreenRay Engine v3.0.0.1"; //Название выводимое в заголовке окна

  memset(&uMsg,0,sizeof(uMsg)); //Передача в структуру флага для оконных сообщений

  //Установка параметров окна, таких как цвет, иконка, стиль окна, курсор
  //и передача их структуре WNDCLASSEX
  WindowClass.lpszClassName = "MainWindow";
  WindowClass.cbSize        = sizeof(WNDCLASSEX);
  WindowClass.style         = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
  WindowClass.lpfnWndProc   = WindowProcessing;
  WindowClass.hInstance     = hInstance;
  WindowClass.hIcon            = ::LoadIcon(0,IDI_APPLICATION);
  WindowClass.hIconSm        = ::LoadIcon(0,IDI_APPLICATION);
  WindowClass.hCursor       = LoadCursor(NULL,IDC_ARROW);
  WindowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WindowClass.lpszMenuName  = NULL;
  WindowClass.cbClsExtra    = 0;
  WindowClass.cbWndExtra    = 0;

  //Регистрация класса окна
  if (!RegisterClassEx(&WindowClass)) return E_FAIL;

  //Теперь когда класс зарегистрирован можно создавать само окно
  Hndl_Wnd = CreateWindowEx(NULL,              //Window Style
                         "MainWindow",         //Window Class Name 
                         FormCaption,          //Caption Of The Window
                         WS_OVERLAPPEDWINDOW,  //Window Style Criterium
                         100,100,              //Left And Top Corner On Desktop
                         FormWidth,FormHeight, //Width And Height Of The Window
                         NULL,                 //Descriptor Of Parent Window
                         NULL,                 //Descriptor Of The Window Menu
                         hInstance,            //Descriptor Of Example Application
                         NULL);                //Pointer On Data Created Window

  //Если создание окна прошло неудачно, то функция вернёт ошибку
  if (Hndl_Wnd == NULL) return E_FAIL;

  ShowWindow(Hndl_Wnd,nCmdShow); //Иначе покажем
  UpdateWindow(Hndl_Wnd); //и обновим наше окно


  //Здесь наше окно начинает интенсивно обрабатывать сообщения от Windows
  while (uMsg.message != WM_QUIT)
  {
    if (PeekMessage(&uMsg,NULL,0,0,PM_REMOVE)) //Нддаа если возникает это событие, то
                                               //происходит уже явный перебор потока сообщений!
    {                                          //они начинают попросту удаляться из потока (данный манёвр 
                                               //позволяет немного разгрузить процессор)
      TranslateMessage(&uMsg); //Трансляция, перевод потока сообщений
      DispatchMessage(&uMsg); //Обслуживание потока сообщений
    } 
  }
 
  //Выгрузка оконного класса он выполнил своё предназначение ;)
  UnregisterClass("MY_WINDOWS_CLASS",WindowClass.hInstance);
  return uMsg.wParam;
} //EndWinMainFunction



Теперь делаем двойной щелчок мыши в "дереве" проекта на файле Form_Layer.h
Код у него будет следующим: 

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine Debugger Module v.3.0.0.1
// Form_Layer.h
// It's An GreenRay Form_Layer Header File.
// Made Specially For Check And Debugging 3DEngine Keep Needed Engine Imports.
/*****************************************************************************/
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX

//Windows And System Directives
#include <windows.h>
#include <atlstr.h>   
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
#include <strsafe.h>



Не забываем после этого нажать кнопку сохранить, пробуем скомпилировать проект, нажав на зелёную стрелку вверху окна Visual Studio:

user posted image

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

user posted image

Если же процесс компиляции прошёл нормально, то перед нами должно появиться окно как на рисунке представленном ниже:

user posted image

Поздравляю вы совершили первый шаг по созданию вашего игрового движка. Двигаемся дальше..

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, стираем у него всё содержимое и меняем на это:

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine Debugger Module v.3.0.0.2
// Form_Layer.h
// It's An GreenRay Form_Layer Header File.
/*****************************************************************************/

#include <GR_Engine.h>



Потом делаем двойной щелчок на файле Form_Layer.cpp также удаляем всё его содержимое и меняем на это:

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine Debugger Module v.3.0.0.2
// Form_Layer.cpp Visual Studio 8 Version.
// It's An GreenRay Form_Layer Source File.
// Made Specially For Check And Debugging 3DEngine.
/*****************************************************************************/
#define STRICT //Обеспечивает переносимость кода, к примеру мы прогу пишем на другой
//винде 16 разрядной к примеру, а объявление этого параметра позволит избежать многих ошибок при 
//компиляции уже к примеру под 32 разрядной ОС.
//Использование STRICT позволяет: 
//1) выполнять строгую проверку типов; 
//2) корректировать и согласовывать описания типа параметра и возвращаемого значения; 
//3) создавать прототипы определений типов для функций обратного вызова (оконные, диалоговые и специальные процедуры); 
//4) согласовывать с ANSI описания структур COMM, DCB и COMSTAT. 
//ну и многое другое, не будем уже углубляться в эти программистские Debri.

#define WIN32_LEAN_AND_MEAN //Позволяет обоийти ошибки множественного объявления 
//стркутур при подключении заголовочных файлов уже имеющих эти структуры. 

#include "Form_Layer.h" //Объявляем здесь наш заголовочный Header-файл

////////////////////////////////////////////////////////////////////////////////
// External Definitions And Prototypes 
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProcessing(HWND Hndl_Wnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);

//-----------------------------------------------------------------------------
// Name: WindowProcessing()
// Desc: Здесь обрабатываются оконные сообщения
//-----------------------------------------------------------------------------
LRESULT CALLBACK WindowProcessing(HWND Hndl_Wnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
  switch(Msg)
  {
    case WM_KEYDOWN:
    {
      if (wParam == VK_ESCAPE) //Перехватили нажатие кнопки Esc на клавиатуре
      {
        PostQuitMessage(0); break; //Обрабатываем
      }
    }
    break;

    case WM_CLOSE: //Перехватили момент закрытия окна при нажатии на крестике в углу экрана 
    {
      PostQuitMessage(0); //Обрабатываем
    }
        
    case WM_DESTROY: //Перехватили момент закрытия окна через трей или диспетчер задач Windows
    {
      PostQuitMessage(0); //Обрабатываем
    }
    break;

    default:
    {
      return DefWindowProc(Hndl_Wnd,Msg,wParam,lParam); //А иначе продолжаем обрабатывать сообщения
    }
    break;
  }
  return 0;

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

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Эта функция предназначена для создания нашего окна
// Это является точкой входа для нашего приложения, иначе в процессе компиляции
// вернётся сообщение об ошибке: Entry point must be defined.
//-----------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
  WNDCLASSEX WindowClass; //Структура необходимая для регистрации оконного класса 
  MSG uMsg; //Оконные сообщения
  HWND Hndl_Wnd = NULL; //Дескриптор оконного класса

  int FormWidth = 640; //Ширина нашего окна 
  int FormHeight = 480; //Высота нашего окна
  LPCSTR FormCaption = "GreenRay Engine v3.0.0.2"; //Название выводимое в заголовке окна

  memset(&uMsg,0,sizeof(uMsg)); //Передача в структуру флага для оконных сообщений

  //Установка параметров окна, таких как цвет, иконка, стиль окна, курсор
  //и передача их структуре WNDCLASSEX
  WindowClass.lpszClassName = "MainWindow";
  WindowClass.cbSize        = sizeof(WNDCLASSEX);
  WindowClass.style         = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
  WindowClass.lpfnWndProc   = WindowProcessing;
  WindowClass.hInstance     = hInstance;
  WindowClass.hIcon            = ::LoadIcon(0,IDI_APPLICATION);
  WindowClass.hIconSm        = ::LoadIcon(0,IDI_APPLICATION);
  WindowClass.hCursor       = LoadCursor(NULL,IDC_ARROW);
  WindowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WindowClass.lpszMenuName  = NULL;
  WindowClass.cbClsExtra    = 0;
  WindowClass.cbWndExtra    = 0;

  //Регистрация класса окна
  if (!RegisterClassEx(&WindowClass)) return E_FAIL;

  //Теперь когда класс зарегистрирован можно создавать само окно
  Hndl_Wnd = CreateWindowEx(NULL,              //Window Style
                         "MainWindow",         //Window Class Name 
                         FormCaption,          //Caption Of The Window
                         WS_OVERLAPPEDWINDOW,  //Window Style Criterium
                         100,100,              //Left And Top Corner On Desktop
                         FormWidth,FormHeight, //Width And Height Of The Window
                         NULL,                 //Descriptor Of Parent Window
                         NULL,                 //Descriptor Of The Window Menu
                         hInstance,            //Descriptor Of Example Application
                         NULL);                //Pointer On Data Created Window

  //Если создание окна прошло неудачно, то функция вернёт ошибку
  if (Hndl_Wnd == NULL) return E_FAIL;

  ShowWindow(Hndl_Wnd,nCmdShow); //Иначе покажем
  UpdateWindow(Hndl_Wnd); //и обновим наше окно

  //Создаём наше Direct3D устройство и укажем Handle нашего окна куда будет в 
  //дальнейшем выводиться графика
  CreateDirect3D(Hndl_Wnd);

  //Здесь наше окно начинает интенсивно обрабатывать сообщения от Windows
  //"крутим" этот цикл пока не поступит комманда закрытия нашего окна
  while (uMsg.message != WM_QUIT)
  {
    if (PeekMessage(&uMsg,NULL,0,0,PM_REMOVE)) //Нддаа если возникает это событие, то
                                               //происходит уже явный перебор потока сообщений!
    {                                          //они начинают попросту удаляться из потока (данный манёвр 
                                               //позволяет немного разгрузить процессор)
      TranslateMessage(&uMsg); //Трансляция, перевод потока сообщений
      DispatchMessage(&uMsg); //Обслуживание потока сообщений
    } 
    //Всё ОК рендерим нашу сцену
    else RenderingDirect3D();
  }

  ReleaseDirect3D(); //Освобождение ресурсов и выгрузка Direct3D
 
  //Выгрузка оконного класса он выполнил своё предназначение ;-)
  UnregisterClass("MY_WINDOWS_CLASS",WindowClass.hInstance);
  return uMsg.wParam;
} //EndWinMainFunction



Тут же быстренько нажимаем на GR_Engine.h и вставляем это:

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine v.3.0.0.2
// GREngine.h Visual Studio 8 Version.
// It's An GreenRay GR_Engine Header File.
/*****************************************************************************/
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX

//Windows And System Directives
#include <windows.h>
#include <atlstr.h>   
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
#include <strsafe.h>

//Direct3D Directives
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#include <d3dx9mesh.h>
#include <dinput.h>

////////////////////////////////////////////////////////////////////////////////
// External Definitions And Prototypes 
////////////////////////////////////////////////////////////////////////////////
HRESULT CreateDirect3D(HWND Hndl_Wnd);
void RenderingDirect3D();
void ReleaseDirect3D();



Это сообщение отредактировал(а) php - 5.9.2014, 07:07
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
php
Дата 10.2.2009, 14:29 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Теперь снова нажимаем на GR_Engine.cpp и вставляем следующий код:

Код

/****************************************************************************/ 
// It's Unofficial Version Of The GreenRay Engine v.3.0.0.2
// GREngine.cpp Visual Studio 8 Version.
// It's An GreenRay GREngine Source File.
// Made Specially For Implement 3D Engine Parameters.
/*****************************************************************************/
//#pragma comment(lib,"d3d9.lib");
//#pragma comment(lib,"d3dx9.lib");
#include <GR_Engine.h>

////////////////////////////////////////////////////////////////////////////////
// Global Variables 
////////////////////////////////////////////////////////////////////////////////
IDirect3DDevice9* m_pDevice = NULL; //The Direct3D Device Interface

//-----------------------------------------------------------------------------
// Name: CreateDirect3D()
// Desc: Эта функция создаёт основное Direct3D устройство
//-----------------------------------------------------------------------------
HRESULT CreateDirect3D(HWND Hndl_Wnd)
{
  HRESULT m_pResult = S_OK; //Set Result By Default
  IDirect3D9* m_pDirect3D = NULL; //This General Direct3D Initialization Interface

  //Создаём объект Direct3D
  m_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION);

  //Проверяем, если возникнет ошибка то освобождаем D3D интерфейс
  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;
  }

  //Автоматическая проверка параметров поддерживаемых дисплеем
  //далее полученные параметры помещаются в стркутуру m_pDisplay
  D3DDISPLAYMODE m_pDisplay; 
  if (FAILED(m_pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&m_pDisplay)))
  {
    if (m_pDirect3D != NULL) m_pDirect3D->Release();
    MessageBoxA(NULL,"GR_Engine.cpp: Failed Get Adapter Display Mode..",
    "GreenRay Engine Error",MB_SYSTEMMODAL|MB_ICONERROR);
    m_pResult = E_FAIL;
  }

  //All System Checks Passed, Create The Direct3D Device
  D3DPRESENT_PARAMETERS m_pD3DParam;
  memset(&m_pD3DParam,0,sizeof(m_pD3DParam));

  //Установка параметров и режимов работы Direct3D устройства 
  m_pD3DParam.SwapEffect                 = D3DSWAPEFFECT_DISCARD; //D3DSWAPEFFECT_COPY;
  
  //Установка разрешения
  m_pD3DParam.BackBufferWidth            = 640; 
  m_pD3DParam.BackBufferHeight           = 480;
  //Здесь указывается режим работы устройства в полный экран (FALSE) или в окне (TRUE)
  //угадайте в каком режиме будет у нас :-))
  m_pD3DParam.Windowed                   = TRUE;

  //Формат заднего буфера, обычно определяется автоматически (m_pDisplay.Format), 
  //но можно указать и вручную в зависимости от поставленных целей
  m_pD3DParam.BackBufferFormat           = m_pDisplay.Format; //D3DFMT_A8R8G8B8 

  //Данный параметр необходимо раскомментировать лишь в том случае, если наше 
  //приложение будет работать на полный экран (здесь как правило указывается 
  //частота развёртки монитора) крайне не советую "играться" с этим параметром, 
  //пусть уж частота определится автоматически (m_pDisplay.RefreshRate)
  //m_pD3DParam.FullScreen_RefreshRateInHz = m_pDisplay.RefreshRate; //D3DPRESENT_RATE_DEFAULT; 
  
  //Включение "стенсельного" буфера, в основном предназначен в дальнейшем для отрисовки
  //эффектов теней и зеркал, короче повторяет очертания исходного объекта
  m_pD3DParam.EnableAutoDepthStencil     = TRUE;

  //Здесь уже указывается формат "стенсельного" буфера
  m_pD3DParam.AutoDepthStencilFormat     = D3DFMT_D16; //D3DFMT_D16 D3DFMT_D15S1 D3DFMT_D24X8
                                                       //D3DFMT_D24S8 D3DFMT_D24X4S4 D3DFMT_D32
  
  //Количество задних буферов
  m_pD3DParam.BackBufferCount            = 2;

  //Кол-во степеней сглаживания для антиалиасинга
  m_pD3DParam.MultiSampleType            = D3DMULTISAMPLE_4_SAMPLES; //4_SAMPLES //For Antialiasing Mode On 4x
  
  //Качество сглаживания
  //m_pD3DParam.MultiSampleQuality       = 1;
  
  //Буфер глубины обычно активируется для создания эффекта Shadow Volume "тень" 
  //m_pD3DParam.Flags                    = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; //|D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  
  //Интервал представления отображаемых объектов и игровой сцены
  m_pD3DParam.PresentationInterval       = D3DPRESENT_INTERVAL_ONE;

  //Если раскомментировать этот параметр, то ощутится явный прирост fps и вообще
  //сцена начнёт отображаться существенно быстрее, т.е помимо видеокарты в процессе 
  //рендеринга начнёт участвовать ваш центральный процессор и загрузит его на 100%
  //Данный параметр использовать не рекомендуется, система работает на износ..
  //Да и вообще процессорное время лучше поберечь для других нужд, 
  //хотя-бы на обработку физики игры..
  //m_pD3DParam.PresentationInterval     = D3DPRESENT_INTERVAL_IMMEDIATE;

  //Создание Direct3D устройства, "скармливаем" ранее установленные параметры нашему устройству
  //Также указываем Handle (Hndl_Wnd) нашего ранее созданного окна, то бишь полотна куда будет выводиться графика 
  if (FAILED(m_pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Hndl_Wnd,
  D3DCREATE_HARDWARE_VERTEXPROCESSING,&m_pD3DParam,&m_pDevice)))
  {
    //Ошибка создания Direct3D устройства освобождаем его
    if (m_pDirect3D != NULL) m_pDirect3D->Release();    
    //Вообще если возникает подобная ошибка, значит мы "скормили" нашему устройству 
    //неверные или не поддерживаемые видеокартой параметры, попробуйте "поиграться" с другими 
    //значениями выставляемые в параметрах, а может вы забыли поставить "дрова" на видеокарту?? :-))))
    MessageBoxA(NULL,"GR_Engine.cpp: Error Creating Direct3D Device..",
    "GreenRay Engine Error",MB_SYSTEMMODAL|MB_ICONERROR);
    m_pResult = E_FAIL;
  }

  //Ending Direct3D Presets Parameters
  if (m_pDevice != NULL)
  {
    //Установка режимов рендера:
    //Весьма интересный и нужный режим состояния рендера
    //при этом режиме происходит "отсечение" невидимых взору граней (полигонов), т.е
    //граней находящихся с задней стороны модели или 3D объекта, они попросту не ренерятся
    //и не отображаюся, это позволяет очень сильно разгрузить работу нашей видеокарты и всей
    //системы в целом.
    //Режим D3DCULL_CW - устанавливает отсечение невидимый граней
    //Режим D3DCULL_CСW - устанавливает тоже отсечение только уже видимых граней (инверсия)
    //Режим D3DCULL_NONE - отключает оба этих режима рендерится вся модель как есть даже 
    //её внутренние части, это уже слишком тяжело для видеокарты, сразу же ощущается падение fps
    //после установки этого режима.
    m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
    
    //Включаем буфер глубины или Z-Buffer, или эффект отдаления объектов или моделей
    //"вглубь" экрана, да уж совсем образно объяснил..
    m_pDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);

    //Режим освещения, нам он пока не нужен, поэтому FALSE
    m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE); 
   
    //Режим рендера отображающий полигоны не цельными SOLID, а в режиме сетки WIREFRAME
    //m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
    
    //Установка цвета амбиентного (общего) освещения
    //m_pDevice->SetRenderState(D3DRS_AMBIENT,0xFFFFFFFF);
    
    //Данная установка включает режим работы антиалиасинга (прменения эффекта сглаживания 
    //рёбер или неровности краёв полигона называется антиалиасингом), нам пока не нужен 
    //поэтому закомментирован
    //m_pDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS,TRUE);
    
    //Установка режима закраски по Гуро, обычно она устанавливается по умолчанию 
    //(закраска по Гуро обычно нужна для сглаживания одутлых или круглых поверхностей,
    //например чтобы шар походил на шар, а не на ребристый комок)
    //m_pDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
  }

  if (m_pDirect3D != NULL) m_pDirect3D->Release(); //Освобождаем Direct3D интерфейс он 
  //выполнил своё предназначение
  return m_pResult; //В конце возвращаем результат работы функции
} //EndCreateDirect3DFunction

//Примечание! Я всё время везде употребляю слово "рендер", а что же это такое
//спросите вы, да всё очень просто Рендер - это отображение, отрисовка если хотите 
//вашего объекта или игровой сцены на экране, или конечный результат обработки данных,
//расчета освещения и.др и последующий вывод на экран монитора, еще иногда 
//употребляют слово "рендерится".

//-----------------------------------------------------------------------------
// Name: RenderingDirect3D()
// Desc: Здесь в этой процедуре происходит отрисовка нашей игровой сцены
//-----------------------------------------------------------------------------
void RenderingDirect3D()
{   
  if (m_pDevice != NULL) 
  {
    //Здесь идёт очистка заднего и Z-буфера соответственно..
    m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET/*|D3DCLEAR_STENCIL*/,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    
    //Begin Scene
    if (SUCCEEDED(m_pDevice->BeginScene()))
    {

      //Здесь и происходит отрисовка нашей конечной сцены
      //начиная от отрисовки моделей, освещения, и заканчивая шейдерными эффектами.
      //Иными словами рендеринг игровой сцены...
      //Vitia_Bubuka->Draw();

      m_pDevice->EndScene();
    }
    m_pDevice->Present(NULL,NULL,NULL,NULL);
  }
} //EndRenderingDirect3DProcedure

//-----------------------------------------------------------------------------
// Name: ReleaseDirect3D()
// Desc: Освобождение ресурсов и устройства Direct3D
//-----------------------------------------------------------------------------
void ReleaseDirect3D()
{
  if (m_pDevice != NULL) m_pDevice->Release();
} //EndReleaseDirect3DProcedure

//------------------------------------------------------------------------------



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

user posted image

Это говорит, что наше Direct3D устройство нормально создалось и инициализировалось,
Так как происходит очистка заднего буфера, то экран становится чёрным, в принципе можно "поиграться" с цветом заднего буфера, его цвет задаётся в строке:

Код

m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET/*|D3DCLEAR_STENCIL*/,D3DCOLOR_XRGB(0,0,0),1.0f,0);


В параметре: 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
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
net968
Дата 13.2.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.2.2009

Репутация: нет
Всего: нет



жду с нетерпением продолжения.Респект тебе smile 
PM MAIL   Вверх
LVI
Дата 25.3.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



В последней версии Microsoft DirectX SDK нет библиотнки "dinput.lib" осталась только "dinput8.lib",
поэтому для нормальной компиляции ее нужно убрать из списка добавляемых библиотек.
PM MAIL   Вверх
php
Дата 26.3.2009, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Ок спасибо за поправку!
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
pirat77
  Дата 12.4.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.11.2008

Репутация: нет
Всего: нет



Спасибо за урок smile ,с нетерпением жду продолжения. smile 
PM MAIL   Вверх
ISergeyN
Дата 14.4.2009, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: нет
Всего: 2



Цитата(php @  10.2.2009,  14:11 Найти цитируемый пост)
для тех кто ещё не умеет программировать, но уже хочет быстро начать "делать свою игру" 

Ну c этим я сомневаюсь. 

PS. ИМХО ваш код уж больно перегружен комментариями. 

Это сообщение отредактировал(а) ISergeyN - 14.4.2009, 02:41
PM MAIL Skype   Вверх
Rickert
Дата 14.4.2009, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



php, молоток, неплохо расписал smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Master Lucky
Дата 22.4.2009, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.1.2008
Где: Торонто, Канада

Репутация: нет
Всего: нет



Макс, клёва, продолжай в том же духе! Такими темпами скоро мы с тобой уже и игрушку свою забабахаем!  smile

Добавлено через 3 минуты
Цитата

PS. ИМХО ваш код уж больно перегружен комментариями. 


А ты попробуй без комментов в коде разобраться......
PM MAIL   Вверх
Rickert
Дата 22.4.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(Master Lucky @  22.4.2009,  05:37 Найти цитируемый пост)
А ты попробуй без комментов в коде разобраться...... 

Каждый день smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
ISergeyN
Дата 22.4.2009, 11:02 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: нет
Всего: 2



Вот это странный код
Код

  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;
  }

PM MAIL Skype   Вверх
php
Дата 22.4.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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;
  } 
 
 

smile Вот вы уже и запутались, а ведь это самые азы и вы хотите сказать, что потом в состоянии разобраться? 

ISergeyN  Вы пред тем что до этого идет хоть удосужились прочитать?

Добавлено через 13 минут и 52 секунды
Master Lucky, да я соббсно могу код вообще без комментариев выкладывать мне же легче будет, но смысл тогда всего этого и этой затеи вообще?, так что ваше замечание абсолютно верно - поддерживаю!
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
ISergeyN
Дата 22.4.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: нет
Всего: 2



Цитата

 Вот вы уже и запутались, а ведь это самые азы и вы хотите сказать, что потом в состоянии разобраться? 

Та вроде нет.
Код

m_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION);

//Проверяем, если возникнет ошибка то освобождаем D3D интерфейс
//то есть функция Direct3DCreate9(D3D_SDK_VERSION) вернула не указатель
//а NULL
if (!m_pDirect3D)//здесь проверяем
{
//эли условие сработало то m_pDirect3D не был создан

//потом вы проверяете если m_pDirect3D был каким то чудом создан
//то освободить память (но условие 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;
//здесь было бы логично вообще выйти из функции HRESULT CreateDirect3D(HWND Hndl_Wnd)
// return E_FAIL;
//и не мучать остальной код(все равно одни ошибки будут)
}

PM MAIL Skype   Вверх
php
Дата 22.4.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



А вы уверены, что в результате ошибки функция Direct3DCreate9(D3D_SDK_VERSION) вернёт 
значение NULL я лично не уверен!
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
ISergeyN
Дата 22.4.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: нет
Всего: 2



Цитата(php @  22.4.2009,  13:50 Найти цитируемый пост)
А вы уверены, что в результате ошибки функция Direct3DCreate9(D3D_SDK_VERSION) вернёт значение NULL я лично не уверен!

Уверен. В справке по DirectX 
Цитата

Return Values
If successful, this function returns a pointer to an IDirect3D9 interface; otherwise, a NULL pointer is returned.


Код

//Create an IDirect3D9 object as shown here:
LPDIRECT3D9 g_pD3D = NULL;
    
if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    return E_FAIL;


PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.1314 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.