保存带有额外数据的 2D Pygame 平台关卡地图的最佳方式

Best way to save a 2D Pygame platformer level tile map with extra data

我正在 Python/Pygame 中使用我自己的引擎制作 2D 平台游戏,并取得了良好的开端。我还制作了一个关卡设计器,可以导出关卡地图并由游戏导入它,但我需要关联不同的东西,比如打开特定门的开关(或者更准确地说,保持特定门打开的压力板)但是我的瓦片地图数组目前只包含瓦片图像索引号。包含关联图块的最佳方式是什么(例如哪个开关打开哪扇门等)?

我是否可以用该数据创建一个额外的文件?还是每个图块有 2 个值?我试过谷歌搜索,但它并没有真正涵盖任何地方。我敢肯定有人有这种经验...我真的不想硬编码,因为我希望游戏尽可能多才多艺。

我会将您的文件格式从每个 2D 单元格存储一个图块索引更改为存储一些更复杂的数据对象。我的第一个想法是每个单元格一个字典,以实现最大的灵活性,但是序列化和存储它会非常大。这里需要在灵活性和存储大小之间进行权衡。

另一种选择是使用 NamedTuples 为每个单元格存储固定数量的参数,同时保留简洁的序列化。 NamedTuples 很好,因为它们可以让您非常简洁地表示数据对象,既可以很好地序列化,也可以使用命名字段进行查询。

您需要问自己的问题是 "what metadata do I need to know about each cell on the map" 和 "how much do I care about concise file size to represent them"。

我的问题的答案是由 @BowlingHawk95 post编辑的,因为使用 NamedTuples 作为数据 object,这使我能够为每个单元格添加多个字段。我想 post 一个示例来显示生成的代码,以及我如何实现它的快照以帮助其他人寻找相同的东西。

# 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 名称和坐标。

非常感谢@BowlingHawk95 的帮助!