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

Для создания демонстрационной 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://my-fantasy.ru/

Комментарии (2)


  1. Expany
    01.06.2023 15:33
    +1

    Оглавление со ссылками на предыдущие статьи серии прикреплять конечно же не нужно?


    1. Expany
      01.06.2023 15:33
      +2

      Позволю себе побыть ТС, для тех, кто заинтересовался:

      - Часть - 6
      - Часть - 5
      - Часть - 4
      - Часть - 3
      - Часть - 2
      - Часть - 1