Лучший способ сохранить 2D-карту уровня платформера Pygame с дополнительными данными - PullRequest
0 голосов
/ 26 июня 2018

Я делаю 2D-платформер, используя свой собственный движок в Python / Pygame, и хорошо начал. Я также сделал дизайнер уровней, который экспортирует карту тайлов уровней, а игра импортирует ее, но мне нужно связать разные вещи, такие как переключатели, которые открывают определенные двери (или, если быть более точным, нажимные пластины, которые удерживают открытую определенную дверь) но мой массив карт мозаики в настоящее время содержит только индексный номер мозаичного изображения. Как лучше всего включить связанные плитки (например, какой переключатель открывает какую дверь и т. Д.)?

Я делаю дополнительный файл с этими данными? Или у меня есть 2 значения для каждой плитки? Я пробовал поискать в Google, но он нигде не освещен. Я уверен, что есть кто-то с таким опытом ... Я действительно не хочу жестко его кодировать, поскольку я хочу, чтобы игра была настолько универсальной, насколько это возможно.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ответ на мой вопрос был опубликован @ BowlingHawk95 как использующий NamedTuples для объекта данных, что позволило мне добавить несколько полей для каждой ячейки. Я хотел опубликовать пример, чтобы показать полученный код и краткий снимок того, как я его реализовал, чтобы помочь кому-то еще, ищущему то же самое.

# Initialise the level data array with NamedTuples;
# 'linked_point' is a tuple (x, y) for an associated cell - e.g. switch associated with a door:
Cell = namedtuple('Cell', ['image_id', 'linked_point'])
level_data = [[Cell(image_id=0, linked_point=(0, 0)) for _ in range(grid_width)] for _ in range(grid_height)]

И теперь, когда я могу добавить координаты (как linked_point), я могу теперь ссылаться на другую ячейку из той, на которой я нахожусь. На следующем рисунке показан снимок моего дизайнера уровней с координатами в строке заголовка, а также с именем image_id и координатами связанной ячейки.

Level Designer Linked Points

Огромное спасибо @ BowlingHawk95 за помощь!

0 голосов
/ 27 июня 2018

Я бы изменил формат вашего файла с хранения одного индекса плитки на 2D ячейку на хранение более сложного объекта данных. Моей первой мыслью было бы создать словарь на ячейку для максимальной гибкости в будущем, но его сериализация и хранение будут довольно большими. Здесь есть компромисс между гибкостью и размером хранилища.

Другим вариантом будет использование NamedTuples для хранения фиксированного количества параметров на ячейку при сохранении краткой сериализации. NamedTuples хороши тем, что позволяют очень кратко представить объект данных таким образом, чтобы они хорошо сериализовались и могли запрашиваться с использованием именованных полей.

Вам нужно задать себе следующие вопросы: «какие метаданные мне нужно знать о каждой ячейке на карте» и «насколько мне важен краткий размер файла для их представления».

...