用额外数据保存2D Pygame Platformer级别切片地图的最佳方法

时间:2018-06-26 20:51:50

标签: python pygame game-engine

我正在使用自己的Python / Pygame引擎制作2D平台游戏,并取得了良好的开端。我还制作了一个关卡设计器来导出关卡图,然后游戏将其导入,但是我需要关联不同的东西,例如打开特定门的开关(或更准确地说,是将特定门保持打开状态的压板)。但我的图块地图数组当前仅包含图块图像索引号。包括相关图块的最佳方法是什么(例如哪个开关打开哪个门等)?

我是否使用该数据制作了一个额外的文件?还是每个图块都有2个值?我已经尝试了谷歌搜索,但是它并没有真正覆盖任何地方。我确定肯定会有这样的经验的人...我真的不想硬编码它,因为我希望游戏尽可能多才多艺。

2 个答案:

答案 0 :(得分:1)

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

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

您需要问自己的问题是“我需要了解地图上每个像元的哪些元数据”和“我要关心多少简明的文件大小来表示它们”。

答案 1 :(得分:1)

我的问题的答案由@ 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的帮助!