我有tile类:
class Tile:
tile_pref = {
"sprites": []
}
pos = Vector2(vector_zero)
def img(self, x, y, tilemap, t):
return self.tile_pref["sprites"][0]
def __init__(self, img, pos):
self.tile_pref["sprites"].append(img)
self.pos = pos
以及另一部分,裁剪:src
是有效的字符串路径,spacing
,tile_size
,offset
是具有.x
和.y
的向量。self.__tiles__
是数组。
img = pyglet.image.load(src)
for i in range((img.height - offset.x) // (spacing.x + tile_size.x) + 1):
for j in range((img.width - offset.y) // (spacing.y + tile_size.y) + 1):
a = offset.x + (tile_size.x + spacing.x) * j
b = offset.y + (tile_size.y + spacing.y) * i
self.__tiles__.append(Tile(img.get_region(a, b, tile_size.x, tile_size.y), Vector2(i, j)))
主要问题是tile_pref["sprites"]
的长度不等于1
,bu等于所有图块的数量。我该如何解决?
img.get_region
时,它会返回一个指向它的链接。因此,只要链接更改,它就会调用append
。这里:
class Tile:
tile_pref = {
"sprites": []
}
pos = Vector2(vector_zero)
您正在将tile_pref
和pos
定义为class属性-属于类的属性(不属于...的实例),并且在所有实例之间共享。除非被实例属性遮盖,否则类属性也可以通过实例使用(这是您可以访问方法的类属性),因此在这里:
def __init__(self, img, pos):
self.tile_pref["sprites"].append(img)
您实际上是在改变类自己的tile_pref
属性-因此,您在此处添加的内容对于所有实例都是可见的。
注意以下行:
self.pos = pos
创建一个'pos'instance属性(您绑定的是名称,而不是变异),这将遮蔽class属性。
关于它的价值,所有这些都是官方教程中的clearly and explicitely documented-因此,我建议您停止正在做的事情,花一天(或两天,如果需要的话)来完成整个] >教程,然后返回您的代码。这将为您节省时间,痛苦和沮丧。