为什么每次循环都会调用 append()?
Why append() is called every loop?
我拿到了地砖class:
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
时,它 returns 我对它的 link。因此,只要 link 发生变化,它就会调用 append
。
这里:
class Tile:
tile_pref = {
"sprites": []
}
pos = Vector2(vector_zero)
您将 tile_pref
和 pos
定义为 class 属性 - 属于 class 的属性(不...的实例),并在所有实例之间共享。除非被实例属性遮蔽,class 属性也可以通过实例使用(这是您访问方法的方式,它们是 class 属性),所以这里:
def __init__(self, img, pos):
self.tile_pref["sprites"].append(img)
你实际上是在改变 class 自己的 tile_pref
属性 - 所以你在这里添加的任何内容都将对所有实例可见。
注意下面一行:
self.pos = pos
创建一个 'pos' instance 属性(您绑定的是名称,而不是变异),它将隐藏 class 属性。
对于它的价值,所有这些都是 clearly and explicitely documented 官方教程 - 所以我建议你停止你正在做的事情,花一天时间(或如果需要,两个)完成 whole 教程,然后返回您的代码。这将为您节省 很多 的时间、痛苦和挫折。
我拿到了地砖class:
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
时,它 returns 我对它的 link。因此,只要 link 发生变化,它就会调用 append
。
这里:
class Tile:
tile_pref = {
"sprites": []
}
pos = Vector2(vector_zero)
您将 tile_pref
和 pos
定义为 class 属性 - 属于 class 的属性(不...的实例),并在所有实例之间共享。除非被实例属性遮蔽,class 属性也可以通过实例使用(这是您访问方法的方式,它们是 class 属性),所以这里:
def __init__(self, img, pos):
self.tile_pref["sprites"].append(img)
你实际上是在改变 class 自己的 tile_pref
属性 - 所以你在这里添加的任何内容都将对所有实例可见。
注意下面一行:
self.pos = pos
创建一个 'pos' instance 属性(您绑定的是名称,而不是变异),它将隐藏 class 属性。
对于它的价值,所有这些都是 clearly and explicitely documented 官方教程 - 所以我建议你停止你正在做的事情,花一天时间(或如果需要,两个)完成 whole 教程,然后返回您的代码。这将为您节省 很多 的时间、痛苦和挫折。