0

我知道如何使用批次同时绘制它们,但我想知道是否有办法一次移动整个批次。我需要单独移动所有精灵吗?

到目前为止,我一直在这样做:

tile2 =pyglet.sprite.Sprite(tile1,0,0,batch = terrain)
tile3 =pyglet.sprite.Sprite(tile1,10,0,batch = terrain)
tile4 =pyglet.sprite.Sprite(tile1,20,0,batch = terrain)
tile5 =pyglet.sprite.Sprite(tile1,30,0,batch = terrain)
tile6 =pyglet.sprite.Sprite(tile1,40,0,batch = terrain)
tile7 =pyglet.sprite.Sprite(tile1,50,0,batch = terrain)

tile2.x += 10
tile3.x += 10
tile4.x += 10

ETC...

但是在成品中会有比这更多的精灵(我希望有 50 多个),移动它们会很烦人。

任何帮助将不胜感激 :)

4

2 回答 2

2

您可能希望将对象存储在适当的数据结构中,例如list

tiles = []
tiles.append(pyglet.sprite.Sprite(tile1,0,0,batch = terrain))
tiles.append(pyglet.sprite.Sprite(tile1,10,0,batch = terrain))
...

列表包含一系列项目,可以单独访问(tiles[0], tiles[1])或循环访问(for tile in tiles:)。该列表可以更改长度,并允许您更改您拥有的瓷砖数量,而无需对大量变量进行硬编码。

然而,这是一种非常冗长的方法,更好的方法是使用循环:

tiles = []
for x in range(0, 51, 10):
    tiles.append(pyglet.sprite.Sprite(tile1, x, 0, batch = terrain))

在这里,我们循环了一系列数字(从 0 到 51,步长为 10 - 注意使用 51,而不是 50 - python 停止在最后一个值上,而不是在它之后,因此range(0, 50, 10)将以 10 为步长产生 0 到 40。) ,创建一个图块并将其添加到我们的列表中。请注意,如果您使用的是 3.x 之前的 Python 版本,xrange()它将比range()返回生成器而不是列表更快。在 Python 3.x 中,这是范围的行为。

但是 Python 可以更加优雅,使用列表推导式轻松创建列表:

tiles = [pyglet.sprite.Sprite(tile1, x, 0, batch = terrain) for x in range(0, 51, 10)] 

然后为了移动它们,我们循环遍历列表,同时移动每一个:

for tile in tiles:
    tile.x += 10

一般来说,做x1, x2, x3, ... 是有问题的标志——使用适当的数据结构将帮助您减少打字,并使您的代码更灵活。考虑这一点的一个好方法是,如果您正在复制和粘贴某些内容,那么可能会将该代码重构为可重用的函数,或者使用循环在多个项目上执行相同的操作。

于 2012-04-16T00:47:37.593 回答
0

我没有足够的声誉来评论 Lattyware 的答案,这是完美的,但我想说:因为你似乎是 python/pyglet 的新手,你可以看看 cocos2d。它建立在 pyglet 之上(您所学到的一切仍然是正确的)并具有一些不错的功能,例如您正在寻找的功能。在 cocos2d 中,您将精灵添加到一个批次中,您可以移动该批次及其所有子项。如果这就是您要查找的内容,您还可以使用 scrollingLayers ...

于 2012-04-17T10:59:07.993 回答