使用pyglet同时移动许多精灵相同的距离

时间:2012-04-16 00:38:46

标签: python sprite pyglet

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

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

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

等...

但是在最终产品中会有更多的精灵(我希望50+)并且将它们全部移动将会非常烦人。

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分: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)将产生0在步骤10到40中,创建一个图块并将其添加到我们的列表中。请注意,如果您使用的是3.x之前版本的Python,xrange()将比range()快,因为它会返回generator,而不是列表。在Python 3.x中,这是范围的行为。

但是Python可以更加优雅,使用list comprehension轻松创建列表:

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

然后移动它们,我们遍历列表,移动每个列表:

for tile in tiles:
    tile.x += 10

一般情况下,执行x1x2x3,......表示出现问题 - 使用适当的数据结构可以帮助您减少输入,并使你的代码更灵活。考虑这个问题的一个好方法是,如果你正在复制和粘贴某些东西,那么可能会将该代码重新分解为可重用的函数,或者使用循环在多个项目上执行相同的操作。

答案 1 :(得分:0)

我没有足够的声誉评论Lattyware的答案,这是完美的,但我想这样说:因为你似乎是python / pyglet的新手,你可以看看cocos2d。它建立在pyglet之上(所有你学到的东西仍然是真的)并且有一些很好的功能,比如你正在寻找的功能。在cocos2d中,您可以向批处理添加精灵,并且可以将批处理与其所有子项一起移动。你也有滚动层,如果你正在寻找...