Доброго времени суток!
Желаю опубликовать цикл уроков по созданию примитивной 4х пошаговой стратегии (TBS). В качестве примера будет использоваться Sid Meier’s Civilization (первая часть, конечно). Плоский вид сверху. Кому хочется изометрии, может переписать часть кода в части вывода изображения карты. Остальные принципы останутся неизменными. Данные уроки будут дублированы в wiki.
Итак, начнём с того, что проясним то, каким правилам я придерживаюсь, и что использую для создания игры. Всё это обозначено здесь. А исходить буду из того, что у вас уже имеются некоторые представления программирования на С/С++, и объяснять, что делает та или иная строчка кода мне дословно не потребуется. Использовать сильно сложные и заумные конструкции для реализации нашей цели я тоже не буду. Весь код будет прокомментирован, исходники можете посмотреть на сайте, указанном в уроке 0. Публиковать новый код буду по мере написания и публикации уроков на этом сайте. Я всю буду практиковать “религию” ООП.
Также, я буду считать, что у вас уже установлена IDE с компилятором, и поставлена туда SFML. Если же нет, то на данном сайте есть пара уроков, как установить SFML к IDE Dev-Cpp, и использовать её в своих проектах под данной средой разработки.
Ну что, поехали?
Открываем среду разработки и создаём новый пустой проект. Я буду использовать собственные названия и пути хранения проекта. Вы же вольны использовать свои. Называем проект: 4x_TBS_Lessons. Сам проект будет храниться в папке: 4x TBS Lessons, файл проекта среды Dev-Cpp я разместил по адресу:
4x TBS Lessons/dev/.
Перейдём к настройкам проекта. Выбираем закладку “Компоновка”. Вводим каталоги вывода объектных и исполняемых файлов.
Для исполняемых: ../bin/dbg/x64/
Для объектных: ../obj/dbg/x64/
Не забываем создать данные папки в корневом каталоге проекта (среда разработки и компилятор их сами не создадут). Ну и переопределяем имя выходного файла: 4x_TBS_Lessons.exe.
Далее. Переходим во вкладку “Параметры”, и в поле под словом “Linker:” вносим все необходимые ключи. Так как я буду использовать статическую линковку SFML к нашему проекту, то и внесу все требуемые для этого ключи. Перечислять их не буду, какие ключи нужны для статической линковки, а какие – для динамической, можно посмотреть здесь.
Во вкладке “Компилятор” выбираем компилятор: “TDM-GCC 4.9.2 64-bit Debug” и нажимаем ОК.
Создаем новый файл и добавляем его к проекту. Назовём его Main.hpp. Там будет храниться все заголовочные файлы SFML, которые мы будем подключать везде, где это нам понадобится:
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef MAIN_HEADER #define MAIN_HEADER #define SFML_STATIC //данную строку удаляем, если динамически линкуемся с SFML //---SFML--- #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/Audio.hpp> #include <SFML/Network.hpp> #include <SFML/System.hpp> #endif |
Создаём ещё один файл и добавляем к проекту. Называем Main.cpp – здесь будет располагаться точка входа в программу (main-функция):
1 2 3 4 5 |
#include "include/Main.hpp" int main(int argc, char *argv[]) { return 0; } |
Так как мы исповедуем принципы ООП, то сразу создаем новый класс, которые будет выполнять функции приложения. Так и назовём – TApplication. Добавим туда три метода: инициализация, рабочий цикл и деинициализация.
Также ещё добавил поле Window – окно, где будет отображаться работа приложения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#ifndef APPLICATION_TYPE_HEADER #define APPLICATION_TYPE_HEADER #include "Main.hpp" namespace Lesson { class TApplication { protected: sf::RenderWindow *Window; public: TApplication(); ~TApplication(); void Init(); void Run(); void End(); }; } #endif |
Чтобы не раздувать статью, я удаляю комментарии из кода, публикуемом здесь. Но полный вариант находится на облаке.
Итак, инициализируем поле Window в методе Init. Также добавляем главный цикл программы в метод Run, и деинициализацию (разрушение) окна в End.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include "include/TApplication.hpp" namespace Lessons { TApplication::TApplication(): Window(nullptr) { } TApplication::~TApplication() { } void TApplication::Init() { Window = new sf::RenderWindow(sf::VideoMode(640, 640), "4X TBS Lessons"); } void TApplication::Run() { while (Window->isOpen()) { sf::Event event; while (Window->pollEvent(event)) { if (event.type == sf::Event::Closed) Window->close(); } } } void TApplication::End() { if (Window != nullptr) delete Window; } } |
Теперь добавляем объект TApplication в main-функцию, и делаем вызовы все трёх методов данного класса.
1 2 3 4 5 6 7 8 9 10 11 |
#include "include/Main.hpp" #include "include/TApplication.hpp" int main(int argc, char *argv[]) { Lessons::TApplication Application; Application.Init(); Application.Run(); Application.End(); return 0; } |
Собираем программу и запускаем. Теперь у нас есть рабочий начальный вариант программы оформленный по всем канонам ООП.
На этом уроке всё. В следующем рассмотрим создание игровой карты, где и будет происходит всё действие игры.