Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用额外数据保存2D Pygame platformer级别平铺贴图的最佳方法_Python_Pygame_Game Engine - Fatal编程技术网

Python 用额外数据保存2D Pygame platformer级别平铺贴图的最佳方法

Python 用额外数据保存2D Pygame platformer级别平铺贴图的最佳方法,python,pygame,game-engine,Python,Pygame,Game Engine,我正在用我自己的Python/Pygame引擎制作一个2D平台,并且已经有了一个良好的开端。我还制作了一个关卡设计器,导出关卡平铺贴图,游戏导入它,但我需要关联不同的东西,比如打开特定门的开关(或者更准确地说,打开特定门的压力板),但我的平铺贴图数组目前只保存平铺图像索引号。包含相关瓷砖的最佳方式是什么(如哪个开关打开哪个门等) 我需要用这些数据制作一个额外的文件吗?或者每个磁贴有2个值?我试过谷歌搜索,但实际上到处都找不到。我肯定有人有这样的经历。。。我真的不想硬编码,因为我希望游戏尽可能多功

我正在用我自己的Python/Pygame引擎制作一个2D平台,并且已经有了一个良好的开端。我还制作了一个关卡设计器,导出关卡平铺贴图,游戏导入它,但我需要关联不同的东西,比如打开特定门的开关(或者更准确地说,打开特定门的压力板),但我的平铺贴图数组目前只保存平铺图像索引号。包含相关瓷砖的最佳方式是什么(如哪个开关打开哪个门等)


我需要用这些数据制作一个额外的文件吗?或者每个磁贴有2个值?我试过谷歌搜索,但实际上到处都找不到。我肯定有人有这样的经历。。。我真的不想硬编码,因为我希望游戏尽可能多功能。

我会将您的文件格式从每个2D单元存储一个平铺索引更改为存储一些更复杂的数据对象。我的第一个想法是每个单元格都有一个字典,以获得最大的灵活性,但是序列化并存储它将非常大。在灵活性和存储容量之间有一个折衷

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


您需要问自己的问题是“我需要了解地图上每个单元格的哪些元数据”和“我有多在乎简洁的文件大小来表示它们”

我会将您的文件格式从每个2D单元格存储一个平铺索引改为存储一些更复杂的数据对象。我的第一个想法是每个单元格都有一个字典,以获得最大的灵活性,但是序列化并存储它将非常大。在灵活性和存储容量之间有一个折衷

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


您需要问自己的问题是“我需要了解地图上每个单元格的哪些元数据”和“我有多在乎简洁的文件大小来表示它们”。

我的问题的答案由@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)]
现在,我可以添加坐标(作为链接点),我现在可以引用我所在单元格中的另一个单元格。下图显示了我的关卡设计器的快照,标题栏中有坐标,还显示了链接单元格的图像id名称和坐标


非常感谢@BowlingHawk95的帮助

我的问题的答案是@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)]
现在,我可以添加坐标(作为链接点),我现在可以引用我所在单元格中的另一个单元格。下图显示了我的关卡设计器的快照,标题栏中有坐标,还显示了链接单元格的图像id名称和坐标


非常感谢@BowlingHawk95的帮助

太棒了!我曾想过使用字典,但我不知道命名元组听起来像是一种方法。在研究了这个数据类型之后,它听起来非常适合我想要实现的目标。谢谢。事实上,我能不能对每个单元格使用一个正常的元组?再想一想,如果我只需要图像ID号和每个单元格的一组坐标,那么NamedTuples可能就太过分了。例如,包含我需要连接到特定门的压力板的单元,我可以使用类似(8,20,20)的东西吗?甚至(8,(20,20))如果一个元组可以包含另一个元组?
level\u data=[(0,0,0)表示范围内的x(grid\u width)]表示范围内的y(grid\u height)]
Oh no,元组是不可变的。元组可能是不可变的,但您始终可以用新元组替换二维网格中的位置。我喜欢在大多数情况下使用NamedTuples,因为它为元素添加了上下文,在您花6个小时调试一个归结为访问该元组的错误元素的问题后,您会非常感激它。同样,当你不需要变量
x
y
时,在列表理解中做这样的事情也是很常见的!我曾想过使用字典,但我不知道命名元组听起来像是一种方法。在研究了这个数据类型之后,它听起来非常适合我想要实现的目标。谢谢。事实上,我能不能对每个单元格使用一个正常的元组?再想一想,如果我只需要图像ID号和每个单元格的一组坐标,那么NamedTuples可能就太过分了。例如,包含我需要连接到特定门的压力板的单元,我可以使用类似(8,20,20)的东西吗?甚至(8,(20,20))如果一个元组可以包含另一个元组?
level\u data=[(0,0,0)表示范围内的x(grid\u width)]表示范围内的y(grid\u height)]
Oh no,元组是不可变的。元组可能是不可变的,但您始终可以替换locati