Я работал над пошаговой игрой, основанной на тайловой карте, используя artemis-odb и libGDX.
Я хотел, чтобы на карте были разные типы местности, такие как трава, песок, вода, горы и так далее, причем каждый из этих разных типов местности имел разную стоимость движения и различные дополнительные свойства, относящиеся к игровому процессу.
В настоящее время я рассматриваю несколько разных подходов:
Я мог бы сделать карту системой
GameMapSystem
и представить каждый тип местности сущностью с соответствующими компонентами для каждого типа местности (например,TerrainStats
, а иногда и компонентами эффектов заклинанийExploding
). Меня больше всего беспокоит, как управлять сопоставлением плиток с объектами типа ландшафта. Концептуально это должно быть так же просто, как поддерживатьint[][]
со значениями, соответствующими идентификатору объекта местности, однако в этом случае компоненты временного маркера (Exploding
) будут прикреплены ко всем данным типам местности одновременно. Это кажется менее чем оптимальным. Тогда мне нужно будет иметь отдельный объект для каждой плитки? Разве я не создаю дополнительные накладные расходы для структуры сущностей, если я сделаю это тогда?Я также подумал о том, чтобы сделать игровую карту и типы ландшафта POJOS, а затем просто создать объекты маркеров с компонентами маркеров для специальных эффектов. Однако, делая это таким образом, похоже, что я буду передавать объект
GameMap
волей-неволей, чтобы различные системы могли его обрабатывать (для рендеринга, коллизий, путей и т. д.). Кроме того, не должна ли моя игровая карта также отслеживать объекты, которые находятся НА карте в любой момент времени, с их позициями, чтобы выполнить мою логику пути? Я бы предпочел, чтобы управление сущностями было полностью в рамках структуры сущностей, если это возможно, поскольку это означает немного более легкое обслуживание.
Мне любопытно, есть ли какие-либо подходы, которые я еще не изучил. В противном случае я склоняюсь к методу № 2, если только нет способа исправить метод № 1, который я упустил из виду.