2012-04-16 59 views
0

我知道如何使用批次同時繪製它們,但我想知道是否有辦法一次移動整個批次。我是否需要單獨移動所有的精靈?用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

你會想你的對象存儲在一個合適的數據結構,如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()更快,因爲它返回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 

一般來說,在做x1,x2,,...是一個跡象表明某些事情是錯誤的 - 使用適當的數據結構將幫助你少打字,並使你的代碼更加靈活。想想一個好辦法是代碼轉換成可重複使用的功能或使用循環來對多個項目進行了同樣的事情,如果你複製和粘貼的東西,那麼很可能再次因素。

+0

感謝解釋它很好:) – user1237200 2012-04-16 00:56:57

0

我沒有足夠的信譽來評論Lattyware答案,這是完美的,但我想這樣說:因爲你似乎是python/pyglet的新手,你可以看看cocos2d。它是建立在pyglet的頂部(你學會了所有仍然是正確的),並有一些不錯的功能,比如你要找的人。在cocos2d中,您可以將精靈添加到批處理中,並且可以將批處理與其所有子節點一起移動。您還可以scrollingLayers如果這就是你要找的...

+0

我看了一下cocos2d的,但我無法得到它的安裝。 :/ – user1237200 2012-04-19 05:07:22

+0

其實不用擔心它的工作現在:) – user1237200 2012-04-19 06:30:50