Создание сервера для онлайн ММО игр на PHP ч. 7 — Игровые локации (тайловые карты)

от автора

Продолжая рассказывать о своем пути создания ПО для догружаемого контента в играх в этой статье хотел бы остановится на игровых картах (локациях).

Для создания демонстрационной MMO RPG игры я выбрал самое простое как мне кажется — тайловые карты. Вся их графика разбита на квадраты из которых собирается сама карта — множество из квадратов повторяется (например земля, вода используют размноженные квадраты составляющие набор тайлов)

В интернете я нашел , что для работы с картами существует программа Tiled — она поддерживает изометрические (2.5D), гексогональные и ортогональные карты.

изометрические карты

изометрические карты
гексогональные карты

гексогональные карты
ортогональные карты

ортогональные карты

Мне понравилось что программа поддерживает выгрузку xml , которая может содержать непроходимые области, VFX  эффекты анимации и инструменты благодаря которым можно делать автоподстановку (выравнивание) тайлов по заранее созданному алгоритму

пример xml фаила
<?xml version="1.0" encoding="UTF-8"?> <map version="1.5" tiledversion="1.7.1" orientation="orthogonal" renderorder="right-down" width="100" height="100" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="4">  <tileset firstgid="1" name="tmw_desert_spacing" tilewidth="32" tileheight="32" spacing="1" margin="1" tilecount="48" columns="8">   <image source="tmw_desert_spacing.png" trans="4affea" width="265" height="199"/>  </tileset>  <tileset firstgid="49" name="tmw_desert_spacing2" tilewidth="32" tileheight="32" spacing="1" margin="1" tilecount="48" columns="8">   <image source="tmw_desert_spacing.png" trans="4affea" width="265" height="199"/>   <tile id="0">    <objectgroup draworder="index" id="2"> <object id="1" x="5.76013" y="7.63843" width="16.2786" height="16.9047"/>    </objectgroup>   </tile>  </tileset>  <layer id="1" name="Слой тайлов 1" width="100" height="100">   <data encoding="csv"> ...  </data>  </layer>  <objectgroup id="3" name="Слой объектов 1">   <object id="1" gid="3221225473" x="105.5" y="66.5" width="32" height="32" rotation="90"/>   <object id="2" gid="3221225503" x="204.639" y="72.6027" width="58.5" height="41" rotation="324.844"/>  </objectgroup> </map>

Я придумал WEB приложение на PHP куда можно загружать файлы формата xml данной программы .

демо на сайте http://my-fantasy.ru

демо на сайте http://my-fantasy.ru

Каждый элемент карты представлял собой класс PHP (назовем их сущностями) с описанием входящих в него атрибутов и других вложенных сущностей. База данных при этом должна иметь одноименные сущностям таблицы и поля (вспоминается ORM от Doctrine).

корневая сущность - карта

корневая сущность — карта
вложенная в карту сущность - слой карты

вложенная в карту сущность — слой карты

Накидав алгоритм автоматического сохранения в БД и загрузки из бд структуры xml фала основанный на reflection, XMLReader , php attribute вся загрузка xml документа свелась к вызову одной строчки в кода в php вида:

(new Tiled\Xml\Map($id))->parse(file_get_contents('1.tmx'))->save();

В случае если будут добавляться сущности или меняться их поля достаточно просто добавить или изменить классы php папках.

После я воспользовался php библиотекой GD что бы собрать картинку из данных что хранились в БД и понял что это плохая идея т.к. php на это тратит огромное количество оперативной памяти .

В перспективе я думаю сделать аналог программы Tiled, но в виде браузерной версии с возможностью редактировать карты, экспортировать в Tiled и создавать свои игровые карты прямо в приложении (осталось подучить JavaScript) и напишу об этом новую статью. Вот пару примеров, что я нашел в интернете:

https://victorribeiro.com/tileEditor/?example=01

https://blurymind.github.io/tilemap-editor/

PS. Как я понял Tiled была создана в процессе разработки open source игры The Mana World карты которой с легкостью загрузились в web приложение

В моем профиле вы найдете ссылки на статьи о продолжении проекта http://mmogick.ru/

История:

  1. Введение

  2. Масштабируемость и асинхронность

  3. WebSocket

  4. Redis

  5. LUA и JavaScript

  6. Выбор технологий, протокола и архитектурный шаблон Entity Component System

  7. Игровые локации (тайловые карты)

  8. Клиентская часть на Unity

  9. Игровые серверные механики

  10. Открытый бесшовный мир в 2D игре

  11. FPS, Ping, паузы между командами, интерполяция и экстраполяция

  12. Очереди и параллельное программирование на CPU

  13. Event-driven паттерн, JSON-RPC и почему не сервисная (SOA) архитектура

  14. Сетевая карта и задержка кадра (Latency frame) по RFC 2544 (1242)

  15. Создание сервера для онлайн ММО игр на PHP

  16. Готовое MVP сервиса 2D MMO RPG игр (realtime)


ссылка на оригинал статьи https://habr.com/ru/articles/725470/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *