粗略背景:
我在Python / Pygame中编写了一些函数,用彩色迷你地图创建平铺水平贴图。小的一个像素代表大的一个像素。
现在我发现,使用Pygame的surface.get_at((x,y))获得的颜色不是元组,尽管它们看起来像......
黑色表面上get_at结果的简短示例:
surf = pygame.Surface((64, 64)).convert()
surf.fill((0, 0, 0))
print(surf.get_at((32, 32))
打印:
(0, 0, 0, 255)
所以我想,创建一个颜色为关键字的词典就像那样:
tiledict = {(0, 0, 0, 255): [tile list 1], (255, 0, 0, 255): [tile list 2], etc}
for y in range(0, tilemap.get_height()):
for x in range(0, tilemap.get_width()):
clr = tilemap.get_at((x, y))
lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]
结果:
lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]
TypeError: unhashable type: 'pygame.Color'
然而,当我将颜色定义为元组并将其用作键之前,它可以工作:
GRAY = (128, 128, 128, 255)
print(GRAY == clr)
的产率:
True
我有我的解决方法:我将字典键设为所有字符串然后以这种方式调用get_at
clr = str(tilemap.get_at((x, y)))
有人知道这里的问题是什么吗?我发现它很有趣。颜色不是元组,因此不可清洗,但是当我问,它是否等于元组时,返回的是#34; True" ...
我还尝试将所有颜色定义为元组,并且它也有效。但这种方法比我目前的方法慢。
有没有人知道我还能尝试什么,而不必去机会?
答案 0 :(得分:2)
相等运算符适用于元组和pygame.Color这一事实并不意味着您可以使用pygame.Color索引到dict。你认为这是相同的比较,但是dicts需要关键对象是可以清除的。
答案 1 :(得分:2)
PyGame.Color
类型具体为supports comparisons to tuples,前提是元组的长度为3或4,并且包含0-255范围内的整数(请参阅RGBAFromObj
source)。
这是明确记录的on the PyGame.Color page:
颜色对象支持与其他颜色对象以及整数的3或4个元素元组的等式比较
任何 Python类都可以通过实现__eq__
method来实现自定义相等性测试。
该类型还将所有内容实现为序列,返回R,G,B和A组件;您可以通过调用PyGame.Color
将tuple()
转换为元组:
tiledict[tuple(clr)]
并通过简单地将元组作为单独的参数传递回一个PyGame.Color
对象:
pygame.Color(*tuple_of_rgba_ints)