Tilemaps в платформе Entity System?

12

Я читал об основах Entity System, в частности Artemis. Я пытаюсь решить, подходит ли это мне. Я строго работаю над 2-пиксельными играми, основанными на плитках, и не думаю, что они когда-нибудь будут такими ресурсоемкими. Я всегда использовал стандартный ООП с большим количеством наследства в прошлом.

Мое понимание Entity System Framework прямо сейчас (я не уверен, что понял его полностью):

  • Сущности не что иное, как идентификаторы
  • Компоненты - просто тупые данные, добавленные в пул компонентов сущностей.
  • Системы - это функции обновления, которые привязаны к миру и обрабатывают каждый объект, соответствующий сигнатуре компонента Системы.

Если мое понимание правильное, то у меня возникло немало проблем с концептуализацией добавления плиточных карт и Поведенческих деревьев AI в эту структуру. Я буду спрашивать об ИИ в будущем.

Должна ли карта тайлов быть встроена в эту структуру? Или он должен храниться отдельно, чтобы его было проще генерировать с помощью редактора тайлкарт?

Если мозаичная карта должна быть встроена в эту структуру, является ли каждая плитка отдельной сущностью? А плитка - это система? Или сама карта тайлов - это единое целое с наследованием, построенным на нем?

Если карта тайлов работает, каков будет лучший способ обнаружения столкновений объектов по внешней карте тайлов?

Я понимаю, что перечисленные мною варианты могут быть правильными, но если бы кто-то делал это в прошлом, они могли бы пролить некоторый свет на мое замешательство. Может быть, есть другая альтернатива, о которой я не подумал?

Спасибо.

Спенсер Марр
источник
Совершенно случайная заметка, координаты X / Y также работают как идентификаторы. Не то, чтобы я предлагал вам реализовать это в вашей системе сущностей, скорее, вы можете прикреплять эффекты к вашим плиткам так же, как и в системе сущностей.
Уильям Мэрайджер
Эй, просто передаю предложение Byte56: компоненты не обязательно должны быть глупыми держателями данных. Иногда было бы полезно, если бы они действительно могли управлять этими данными; векторы, например.
Jcora
Мне очень нравится это предложение. Я могу добавить мозаичные карты в структуру сущностей без необходимости отделять помощники мозаичной карты от данных или разбивать мозаичную карту на несколько компонентов / сущностей.
Спенсер Марр
Tilemap - это просто еще один компонент, и система коллизий и система рендеринга обрабатывают коллизии с помощью тайл-карты и рендеринга тайл-карты
Kikaimaru

Ответы:

8

Я реализовал структуру компонентов сущности (похожую на Artemis) после того, как я уже некоторое время находился в разработке, но я не думаю, что я бы поступил иначе, если бы начал с чистого листа.

Мой мир полностью отделен от структуры сущностей. Мне просто не имело смысла превращать мир в какую-то сущность или совокупность сущностей. Мой мир - это 3D с кубиками, но я верю, что то же самое относится и к плиткам. Сущности составляют все остальное в мире, но местность отдельна. Однако, когда кубы удалены, они порождают «материальные» сущности.

Обнаружение столкновений не так уж и сложно. В вашем мире, вероятно, будут isSolidAt(x,y)методы типа, которые будет использовать ваша система столкновений. Честность, я сказал это однажды уже сегодня в другом ответе , делай то, что имеет для тебя наибольшее значение. Вы не нарушаете никаких правил, делая карту тайлов отдельно или делая ее сущностью. Все, что вы можете обернуть голову, это то, что лучше. Для меня это делало мир отдельным и делало все остальное сущностями.

MichaelHouse
источник
1
Скажи, что моя карта - это сущность. Как другой объект мог бы получить доступ к isSolidAtметоду карты ?
Херардо Марсет
Хранение карты как объекта, вероятно, не очень хорошая идея для этой ситуации. Я полагаю, вы должны напрямую общаться с ним в этой ситуации. Система, отвечающая за объект карты, будет иметь доступ к объекту карты и сможет извлекать информацию из этого объекта при запросе.
MichaelHouse
4

Я добавил плитку как отдельный компонент к объекту (со всеми плитками внутри), а также есть отдельное средство рендеринга для карты плиток, так что я могу визуализировать его в 3d или в 2d. Создать все плитки как объекты можно, но дорого.

что-то такое:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

Преимущество отделения чертежа от логики - базовая идея шаблона MVC

Евгений
источник
1
Вся мозаичная карта содержится в одном компоненте? Это связано с какой-то сущностью игровой среды / главной сущностью? Я вижу довольно большое преимущество, полученное при отделении рендера от компонента tilemap.
Спенсер Марр
Спасибо за обновление вашего ответа! Я люблю фрагменты кода.
Спенсер Марр