Загрузка...
 
Печать
ИГРОКОДИНГ  »  ИГРОКОДИНГ: Учебный курс  »  Программируем 3D-шутер от первого лица (FPS) (Win32, Cpp, DirectX9)  »  Часть 1. Создание движка  »  1.6 Тестируем фреймворк движка
Программируем 3D-шутер от первого лица (FPS) (Win32, C++, DirectX9)

1.6 Тестируем фреймворк движка


Компилируем Проект Engine

Поздравляю, командeр! Теперь, когда все необходимые файлы созданы и всё готово к первой компиляции, пришло время испытать фреймворк нашего движка в деле!

Рис. 1 Сейчас Проект нашего движка выглядит так
Рис. 1 Сейчас Проект нашего движка выглядит так

Сейчас в Проекте нашего движка всего 5 файлов: Engine.h, Engine.cpp, LinkedList.h, ResourceManagement.h и Geometry.h, которые мы создали в предыдущих главах (см. Рис. 1).

Перед первой компиляцией проверь натройки проекта в MSVC++2010:

  • Проверь, что напротив пункта "Тип конфигурации" (Проект->Свойства->Свойства конфигурации->Общие) стоит "Статическая библиотека (.lib)" (см Рис. 2).
Рис. 2 Выбираем тип компилируемого файла
Рис. 2 Выбираем тип компилируемого файла
  • Проверь, что напротив пункта "Каталоги включения" (Проект->Свойства->Свойства конфигурации->Каталоги VC++) указаны действительные пути к каталогам включения DirectX SDK (подкаталог include), установленного на компьютере.
  • Проверь, что напротив пункта "Каталоги библиотек" (Проект->Свойства->Свойства конфигурации->Каталоги VC++) указаны действительные пути к каталогам библиотек DirectX SDK (подкаталог lib), установленного на компьютере.

Весь процесс указания путей к каталогам включения и библиотек MS DirectX SDK подробно расписан здесь: Настройка MS Visual C plus plus 2010 и DirectX SDK).

Если "все системы в норме", компилируем исходный код в библиотеку .lib одним из следующих способов:

  • В главном окне MSVC++2010 нажать F7.
  • В главном меню MSVC++2010 (вверху) выбрать Отладка->Построить решение.
  • В Обозревателе решений щёлкаем правой кнопкой мыши по значку Проекта Engine. Во всплывающем меню выбираем "Построение" (или чуть ниже пункт "Перестроить", если код уже был успешно скомпилирован ранее).

Image
По окончании компиляции (обычно, при создании небольших проектов, она занимает менее 1 секунды) в панели "Вывод" (в нижней части главного окна IDE) будет представлен отчёт (лог) об успешной (либо неуспешной) компиляции.
В нашем случае компиляция прошла успешно:
Image
Как видно, итоговый двоичный файл библиотеки .lib расположен на жёстком диске ПК по адресу: С:\Users\<Имя пользователя>\documents\visual studio 2010\Projects\GameProject01\Debug\Engine.lib.
(В разных ОС путь к файлу может отличаться от представленного).

Закрыть
noteЕсли компиляция завершилась неудачей (с ошибками)...

В случае возникновения ошибок, в панели Вывод можно найти исчерпывающую информацию о том, в каком файле и на какой его строке возникла ошибка. Также, присутствует весьма подробное описание ошибки (на англ. языке). Самые распространённые ошибки - синтаксические. Они возникают, как правило, из-за невнимательности того, кто набирал исходный код. Ищи, проверяй, так как у нас всё скомпилировалось без проблем. Yandex тебе в помощь.

Закрыть
noteОбрати внимание...

Следует отличать ошибки (errors) от предупреждений (warnings). Компиляция может завершится успешно даже при выводе сотен всевозможных предупреждений. Чаще всего они связаны с использованием устаревших (deprecated) либо небезопасных (unsafe), по мнению Microsoft, функций. За основу учебного курса была взята книга Young V. "Programming Multiplayer FPS in DirectX", вышедшая в свет в 2005 году, где все примеры написаны под классический C++ в IDE MS Visual C++ 6.0 аж 1998 года выпуска. С тех пор очень многое изменилось. Microsoft развивала C++, Windows API и свои IDE семимильными шагами. В результате многие функции, успешно применявшиеся тогда, сегодня признаны Microsoft устаревшими и не рекомендованными к использованию. К предупреждениям можно прислушиваться, а можно и нет. Для простоты изложения мы будем их игнорить. А чтобы они не выводились совсем, пропиши строку _CRT_SECURE_NO_WARNINGS в свойствах Проекта Engine (Свойства -> Свойства конфигурации -> С/С++ -> Препроцессор -> Определения препроцессора).

Создаём Проект Test (тестовое приложение)

Сама по себе библиотека Engine.lib мало интересна твоим друзьям, т.к. автономно под ОС MS Windows её не запустишь. Для проверки работоспособности фреймворка нашего движка создадим ещё один проект, конечной целью которого станет приложение (исполняемый файл .exe), показывающее при запуске окно.

Закрыть
noteОбрати внимание!

Наш новый Проект (назовём его Test) будет размещаться внутри Решения GameProject01 вместе с уже имеющимся Проектом Engine. Оба этих Проекта (Engine и Test) будут одновременно представлены в Обозревателе решений главного окна MS Visual C++ 2010 (один под другим). "Решения" как способ организации объёмных программерских разработок в едином рабочем пространстве были впервые представлены в MS Visual Studio 2005, заменив т.н. "Рабочие пространства" (workspaces).


ОК, приступаем:

  • Стартуй MS Visual Studio 2010 и открой Решение GameProject01, с которым работал до этого (если не сделал этого раньше).
  • Создай новый пустой Проект Win32. (В Главном меню: Файл->Создать->Проект...).

В окне "Создать Проект":

  • Отмечаем щелчком пункт "Проект Win32"
  • Вводим имя Проекта "Test".
  • В строке "Решение" из всплывающего списка выбираем "Добавить в Решение".

Image

  • Жмём ОК.

В Мастере приложений:

  • На странице "Параметры приложения" оставляем флажок "Приложение Windows" и отмечаем галкой пункт "Пустой проект".

Image

  • Жмём "Готово".

Теперь наше Решение GameProject01 содержит 2 Проекта: Engine и Test:
Image

  • Обязательно настрой в Проекте Test пути к DirectX SDK (да, ещё раз). (В Обозревателе решений щёлкни правой кнопкой мыши по названию Проекта. Во всплывающем контекстном меню: Свойства->Свойства конфигурации->Каталоги VC++... А вообще, весь процесс подробно расписан здесь: Настройка MS Visual C plus plus 2010 и DirectX SDK.)
  • Сохрани Решение (Файл->Сохранить все).


Проект создан. Так как это "Пустой проект", он не содержит в себе никаких файлов. В левой части главного окна MS Visual C++ 2010 расположен "Обозреватель решений". (Если его нет, в главном меню выбираем: Вид->Другие окна->Обозреватель решений. Или комбинация горячих клавиш Ctrl+Alt+L.) В Обозревателе решений видна древовидная структура Проектов, входящих в данное Решение. Чуть ниже названия Проекта видим специально заготовленные папки (в MSVC++2010 они называются "фильтры") для файлов Проекта.

Закрыть
noteПримечание

В MS Visual C++ 2010 в настройках по умолчанию стоит набор (кодировка) символов UNICODE. В MS Visual C++ 6.0 - напротив, по умолчанию стоит кодировка ANSI (многобайтовая). Данная настройка сильно влияет на типы используемых переменных, что приводит к заметным различиям в исходном коде.
Несмотря на то, что во всех случаях рекомендуется использовать кодировку UNICODE, поддерживаемую во всех современных ОС семейства MS Windows (начиная с Win 2000/XP), большинство книг по программированию игр на классическом C++ придерживаются именно многобайтовой кодировки. Чтобы сильно не переделывать исходные коды под UNICODE, все наши игровые Проекты мы настроим под многобайтовую кодировку. Для этого...

  • В Обозревателе решений щёлкаем по названию только что созданного Проекта Test.
  • Во всплывающем меню выбираем "Свойства"
  • В появившемся окне установки свойств Проекта жмём "Свойства конфигурации", в правой части в строке "Набор символов" выставляем значение "Использовать многобайтовую кодировку".
  • Жмём ОК.
  • Сохрани Решение (Файл->Сохранить все)

Image
Напомним, что такую настройку необходимо повторно проделывать при создании каждого нового Проекта.

Создаём Main.cpp (Проект Test)

В только что созданном Проекте Test cоздадим файл исходного кода Main.cpp, в котором будет содержаться реализация функции WinMain, внутри которой происходит инициализация (EngineSetup) и запуск движка (g_engine->Run();) через глобальный указатель g_engine:

  • В "Обозревателе решений" главного окна MSVC++2010 щёлкни правой кнопкой мыши по папке (в терминологии Майкрософт это не папки, а фильтры!) "Файлы исходного кода" Проекта Test.
  • Во всплывающем меню Добавить->Создать элемент...
  • В появившемся окне выбери "Файл С++ (.cpp)" и в поле "Имя" введи "Main.cpp".
  • Жмём "Добавить".

Добавленный файл сразу откроется в правой части MSVC++2010.

  • В только что созданном и открытом файле Main.cpp набираем следующий код:
Main.cpp
//-----------------------------------------------------------------------------
// System Includes
//-----------------------------------------------------------------------------
#include <windows.h>

//-----------------------------------------------------------------------------
// Engine Includes
//-----------------------------------------------------------------------------
#include "..\GameProject01\Engine.h"

//-----------------------------------------------------------------------------
// Entry point for the application.
//-----------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE instance, HINSTANCE prev, LPSTR cmdLine, int cmdShow )
{
	// Create the engine setup structure.
	EngineSetup setup;
	setup.instance = instance;
	setup.name = "Framework Test";

	// Create the engine (using the setup structure), then run it.
	new Engine( &setup );
	g_engine->Run();

	return true;
}


Да, это весь исходный код. Более того, это единственный исходный файл, который мы создадим в этом прото-игровом Проекте! Ведь, Проект Test является временной заменой Проекта Game, в котором мы собираемся реализовать код, относящийся к игре.
В начале листинга видим инструкцию #include <windows.h>, подключающую к нашему Проекту Test заголовок с базовым функционалом Win32 API. Необходим для функции WinMain.
В следующей директиве #include мы указываем действительный путь к заголовочному файлу Engine.h Проекта Engine (который сначала назывался так же как Решение GameProject01).

Закрыть
noteНа заметку

Чуть позднее мы подключим библиотеку Engine.lib, в которой заключён весь функционал движка. Так вот, Engine.h как раз и является интерфейсом этой библиотеки и всего движка вцелом. Наличие в файле исходного кода всего одной ссылки на заголовок движка соответствует принятой ранее концепции единой точки контакта.

Обрати внимание на максимальную модульность нашего движка. Все громоздкие процедуры по инициализации и созданию движка скрыты в недрах Проекта Engine. В Проекте Test мы видим реализацию функции WinMain, в которой с помощью нескольких строк кода мы даём команду по инициализации движка и его дальнейшему запуску.
Следующий шаг - имплементация функции WinMain, которая является главной функцией в любом Windows-приложении. Напомним, что WinMain - это точка входа в наше приложение.
Функция WinMain имеет ряд параметров, которые ей передаёт ОС MS Windows. Единственный из них, который заслуживает внимания, это HINSTANCE instance, который является дескриптором нашего экземпляра приложения. Передача этого параметра через структуру EngineSetup...

Main.cpp
...
	// Create the engine setup structure.
	EngineSetup setup;
	setup.instance = instance;
...

...совсем не обязательна, но, вцелом, считается хорошей идеей и является признаком профессионализма. Именно через это присваивание движок имеет возможность ссылаться на наше приложение.
В стркутуре EngineSetup мы также можем указать имя приложения (точнее, переопределить его; т.к. имя по умолчанию уже указано в Engine.cpp Проекта Engine). Именно оно будет выводится на тайтлбаре, когда приложение будет запущено в оконном режиме (т.е. не развёрнуто во весь экран).
Следующий шаг - создать экземпляр (инстанс) класса Engine и передать в него созданную чуть выше структуру EngineSetup. Здесь вызывается конструктор класса Engine, который присваивает глобальному указателю g_engine адрес в памяти, где хранится экземпляр класса Engine.
На последнем этапе вызывется функция Run(), которая вводит движок в игровой цикл (game loop), непрекращающийся до момента выхода из приложения. Кстати, на данный момент у нас не созданы методы выхода из нашего тестового приложения. Поэтому, для закрытия окна приложения, которое мы создадим через несколько минут, используй сочетание клавиш Alt+F4 или вызывай менеджер задач Windows (Ctrl+Alt+Delete).

Подготовка Проекта Test к компиляции

Несмотря на то, что мы больше не будем добавлять в Проект Test никаких других файлов с исходным кодом, для его успешной компиляции в него необходимо добавить библиотеку Engine.lib (ту самую, что была сгенерирована при компиляции Проекта Engine). Она необходима для правильного импортирования пространства имён (в частности, глобального указателя g_engine). Именно поэтому в директиве #include мы указываем действительный путь к заголовочному файлу Engine.h Проекта Engine, который сначала назывался по имени Решения GameProject01.

Для добавления в Проект Test библиотеки Engine.lib:

  • В Обозревателе решений щёлкни правой кнопкой мыши по названию Проекта Test.
  • Во всплывающем контекстном меню выбираем: Добавить->Существующий элемент...
  • В появившемся окне выбираем файл Engine.lib из каталога Debug решения GameProject01 и жмём "Добавить".

В нашем случае полный путь к Engine.lib был такой: C:\Users\<UserName>\Documents\Visual Studio 2010\Projects\GameProject01\Debug.
Добавленный файл появится в Обозревателе решений, чуть ниже всех фильтров.

Но и это ещё не всё. При разработке движка мы использовали хитрую функцию GetTime() для правильной работы которой требуется "принудительно" подключить к Проекту библиотеку winmm.lib, хранящуюся в недрах MS Visual C++.
Для этого:

  • В Обозревателе решений щёлкни правой кнопкой мыши по названию Проекта Test.
  • Во всплывающем контекстном меню выбираем пункт "Свойства".
  • В появившемся окне: Свойства конфигурации -> Компоновщик -> Ввод. Во всплывающем списке напротив пункта "Дополнительные зависимости" выбираем "Изменить...".
  • В появившемся окне "Дополнительные зависимости" в поле ввода набираем winmm.lib.
  • Жмём ОК, ОК.
  • Сохрани изменения в Решении (Файл->Сохранить все).


Сразу после этого компилируем Проект Test:

  • В Обозревателе решений щёлкни правой кнопкой мыши по названию Проекта Test.
  • Во всплывающем контекстном меню выбираем: Перестроить.

Закрыть
noteНа заметку

При текущих настройках таким образом перекомпилируется только Проект Test. Для компиляции всего Решения:

  • В Обозревателе решений щёлкни правой кнопкой мыши по названию Проекта "Test". Во всплывающем контекстном меню выбери пункт "Зависимости проектов..." и в появившемся окне отметь галкой Проект Engine. Жми ОК. Теперь каждая компиляция Проекта Test "потянет" за собой обязательную перекомпиляцию Проекта Engine. Как результат, в Проекте Test всегда будет самая свежая и актуальная версия библиотеки Engine.lib.
  • Щёлкни правой кнопкой мыши по названию Проекта Test. Во всплывающем меню выбери "Перестроить".


Компиляция завершилась успешно. Итоговый исполняемый двоичный файл (Test.exe) расположен на жёстком диске ПК в той же директории, что и библиотека движка.
В нашем случае, это: С:\Users\<Имя пользователя>\documents\visual studio 2010\Projects\GameProject01\Debug. (В разных ОС путь к файлу может отличаться от представленного).
Найди и запусти получившееся приложение.

Закрыть
noteНа заметку

Напомним, что в данный момент у нас не созданы методы выхода из нашего тестового приложения. Поэтому, для закрытия окна приложения, которое появилось после запуска Test.exe, используй сочетание клавиш Alt+F4 или вызывай менеджер задач Windows (Ctrl+Alt+Delete). В следующей Главе мы как раз и займёмся созданием органов управления нашего приложения, когда будем внедрять в движок систему пользовательского ввода.


Полученный файл приложения, в принципе, автономен и без труда запустится, в общем-то, на любом компьютере под управлением MS Windows 2000/XP/Vista/7. Не забываем, что чуть позднее он, как и подобает любой нормальной игре, "обрастёт" каталогами с ресурсами. Но об этом позже.

Исходные коды Решения GameProject01 (для MS Visual C++ 2010), которое разрабатывали на протяжении Глав 1.1-1.6 данного курса, забираем здесь(external link).

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


ИГРОКОДИНГ  »  ИГРОКОДИНГ: Учебный курс  »  Программируем 3D-шутер от первого лица (FPS) (Win32, Cpp, DirectX9)  »  Часть 1. Создание движка  »  1.6 Тестируем фреймворк движка

Contributors to this page: slymentat .
Последнее изменение страницы Четверг 02 / Март, 2017 10:47:56 MSK автор slymentat.

Последние комментарии

No records to display

Хостинг