Дипломная работа: Разработка многопользовательской ролевой онлайн игры World of Magic

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Рисунок 4.12 Три персонажа встали в ряд для наглядности положения

Рисунок 4.13 Консоль сервера после выхода трёх персонажей и планового выключения сервера

Рисунок 4.14 Скриншот консолей и клиентского приложения после включения сервера повторно

Заключение

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

После анализа идёт проектирование системы. Первым делом разработали архитектуру системы, состоящую из базы данных, клиентского и серверного приложений. Для разработки программ были проанализированы и выбраны средства разработки, подходящие для этих целей - это Visual Studio 2017 Community и MySQL Server. Для хранения данных о состоянии игры к сервер-приложению должна быть подключена база данных, для которой была спроектирована схема базы данных. Также не маловажным этапом в проектировании является разработка графического пользовательского интерфейса, чтобы пользователю было удобно работать с нашей программой.

После этапа проектирования идёт этап реализации. На этом этапе я реализовывал спроектированную систему. Клиентское и серверные приложения, а также часть серверного приложения, отвечающая за создание базы данных, её поддержку и взаимодействие с ней удалось разработать. В клиентском приложении можно выделить четыре основных компонента: графический интерфейс пользователя, сетевой модуль, игровой (логический) модуль и графический модуль. В серверном приложении можно выделить три части: модуль связи с базой данных, он же, по совместительству, модуль данных, сетевой модуль и модуль обработки игры (логический).

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

Распространение игрового приложение планируется в виде архива, содержащего приложение-клиент и все файлы, необходимые для поддержки этого приложения: файлы инициализации, dll-файлы, картинки, музыка и звуки, шрифты и другие. После получения архива клиент может извлечь данные из него, и, собственно, запустить игру. Если сервер в это время будет включен, а клиентское приложение будет знать правильный IP-адрес и порт, то игра запуститься. В будущем, когда игра обрастёт достаточным функционалом, она будет распространяться с помощью Steam либо собственными силами.

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

Список использованных источников

1. Мировой рынок заработает $137.9 млрд. за 2018 год [Электронный ресурс]. Режим доступа: https://app2top.ru/industry/mirovoj-ry-nok-igr-zarabotaet-137-9-mlrd-za-2018-god-120106.html (дата обращения: 12.05.19)

2. Лучший игровой движок по версии пользователей хабра [Электронный ресурс]. Режим доступа: https://habr.com/ru/post/307952/ (дата обращения: 19.03.19)

3. Unity против Unreal Engine 4: Битва титанов [Электронный ресурс]. Режим доступа: https://visschool.ru/blog/3d-viz-blog/unity-vs-unreal-engine-4-bitva-titanov-27/ (дата обращения: 19.03.19)

4. Обзор графических библиотек для С++ [Электронный ресурс]. Режим доступа: https://tproger.ru/digest/cpp-best-gui/ (дата обращения: 22.03.19)

5. 10 лучших IDE [Электронный ресурс]. Режим доступа: https://www.internet-technologies.ru/articles/10-luchshih-ide.html (дата обращения: 19.03.19).

6. Как начать писать игры [Электронный ресурс]. Режим доступа: https://habr.com/ru/post/160547/ (дата обращения: 19.03.19)

7. Глейзер Дж., Мадхав С. Многопользовательские игры. Разработка сетевых приложений. СПб.: Питер, 2017. 368 с.

8. Никсон Р. Создаём динамические веб-сайты с помощью PHP, MySQL и JavaScript. СПб.: Питер, 2013. 496 с.

9. Павловкая Т.А. С/С++. Программирование на языке высокого уровня. СПб.: Питер, 2014. 461 с.

10. Страуструп Б. Язык программирования С++. СПб.: БИНОМ, 1999. 991 с.

11. Луис Д. C и C++. Справочник. М.: Восточная книжная компания, 1997. 592 с.

12. Как делать свои игры бесплатно? Руководство по разработки инди-игр от T3 [Электронный ресурс]. Режим доступа: https://habr.com/ru/company/miip/blog/321922/ (дата обращения: 19.03.19)

Приложение 1

Блок-схема функции server_accept

Приложение 2

Файл Elements.h

// GUI v0.2

#ifndef DSL__GUI_ELEMENTS__H

#define DSL__GUI_ELEMENTS__H

// Headers

#include "Element.h"

// Defines

#define TYPE_WINDOW 1

#define TYPE_IMAGE 2

#define TYPE_LABEL 3

#define TYPE_BUTTON 4

#define TYPE_TEXTBOX 5

#define TYPE_CHECKBOX 6

#define TYPE_SLOT 7

class GUI;

class slotik;

class Window;

class SpaceItem;

class Game;

class Label: public Element

{

sf::Text* text;

public:

Label(sf::Text* t = nullptr);

Label(std::string str);

~Label();

void setText(std::string str, int code=0);

void draw(sf::RenderWindow* window);

void setPosition(float x, float y);

void setPosition(sf::Vector2f position);

void update();

};

class Button: public Element

{

void (*ptr_funct)(Game*, string, string); // ссылка на вып.функцию

sf::Text* text; // текст на кнопочке

public:

Button( void (*func)(Game*, string, string)=nullptr );

Button(std::string str, void (*func)(Game*, string, string)=nullptr);

Button(sf::Text* t, void (*func)(Game*, string, string)=nullptr);

~Button();

void draw(sf::RenderWindow* window);

void perform(std::string s1, std::string s2);

void setText(std::string str, int code=0);

void setPosition(float x, float y);

void setPosition(sf::Vector2f position);

void update();

};

class Slot: public Element

{

sf::Text text;

public:

sf::Sprite* sprite_item;

slotik* item;

Slot();

void draw(sf::RenderWindow* window);

void setPosition(float x, float y);

void setPosition(sf::Vector2f position);

void update();

void setText(std::string str, int code=0);

};

class Window: public Element

{

protected:

SpaceItem* items; // ссылка на сумку

Label text_name;

Button close;

std::vector<Element*> standart; // Базовые элементы на окне

std::vector<Element*> vec; // Добавленные элементы на окне

std::vector<Slot*> vecSlots; // Слоты

std::vector<Button*> vecButtons; // Кнопки

public:

bool isGhost; // Окно призрак - не учитывается при событиях мыши

GUI* gui;

Window();

Window(int code);

~Window();

void addElement(sf::Vector2f offset, Element* element);

void addElement(sf::Vector2f offset, int type_element);

void draw(sf::RenderWindow* window);

void draw(sf::RenderWindow* window, SpaceItem* items, bool isNull=false);

bool eventKey(int type, int code);

bool eventMouse(int type, int code);

void setText(std::string text, int code=0);

void update();

void setPosition(float x, float y);

void setPosition(sf::Vector2f position);

bool checkClose(float x, float y);

Button* checkButtons(float x, float y);

void updateSpaceItem(SpaceItem* xxx, int id=-1, int num=-1);

Element* getElement(int id);

Element* getElement(int type, int num);

Element* getElement(int type, sf::Vector2i pos);

int getNumSlot(sf::Vector2i pos);

void setSprite(sf::Sprite* s, int code=0);

void clearSlots();

};

#endif //DSL__GUI_ELEMENTS__H