Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров3K

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

Для создания демонстрационной 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)

Теги:
Хабы:
Всего голосов 2: ↑2 и ↓0+2
Комментарии2

Публикации

Истории

Работа

PHP программист
106 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань