2011-03-05 71 views
2

我已經嘗試了用於循環使用的blit和借鑑的方法和使用不同的變量「PlayerSprite」和「Treegroup」我將如何爲多組精靈創建隨機位置?

for PlayerSprite in Treegroup: 
    surface.blit(PlayerSprite,(random.randrange(100,500),random.randrange(100,600))) 

也試過

SPRITES=[] 
for Sprites in range(10): 
    Sprites= PlayerSprite 
    SPRITES.append(Sprites) 

我得到的是錯誤

screen=pygame.display.set_mode((640,480)) 
background1=pygame.image.load("C:\Pygame-Docs\examples\data\Random Map.bmp") 


class Tree1(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image=pygame.image.load('C:\Pygame-Docs\examples\data\Tree 1.bmp') 
     self.image=self.image.convert() 
     self.rect=self.image.get_rect() 
     self.rect.centerx=random.randrange(10,100) 
     self.rect.centery=random.randrange(10,100) 

# Makes a group of trees 
Howmanytrees=random.randrange(5,10) 
Trees=[]   
for tree in range(Howmanytrees):    
trees=Tree1() 
Trees.append(trees) 

# Howmany groups 
for Treegroup in range(10): 
    Treegroup=Trees 

# Places groups 

PlayerSprite=pygame.sprite.Group(Treegroup) 

# keeps loop (game) going until canceled 
keepgoing=True 
while keepgoing: 

    for event in pygame.event.get(): 
     if event.type==pygame.QUIT: 
     keepgoing=False 

# actually draws screen 
screen.blit(background1,(0,0)) 
PlayerSprite.draw(screen) 
pygame.display.flip() 

此代碼僅顯示5到10棵樹「Trees = []」 而沒有別的。我已經在這個問題上工作了一個多星期,閱讀了很多教程,看過很多網站,似乎沒有任何工作。我必須忽視或忽略一些事件。我認爲這很容易!

非常感謝!

回答

0

這對我來說並沒有多大意義。

for tree in range(Howmanytrees):    
trees=Tree1() 
Trees.append(trees) 

你的循環在這裏什麼也沒做。樹應該是介於0和Howmanytrees之間的數字。同樣,下面的塊不縮進,所以它不是循環的一部分。即使如此,該塊仍然無法工作。另外,你用變量名稱來混淆你自己和我們。樹是對象?樹是名單?不要這樣做。認真。

不知道下面的代碼是什麼。

# Howmany groups 
for Treegroup in range(10): 
    Treegroup=Trees 

創建您的SpriteGroup傳遞上述樹列表?或者我錯過了什麼:) TreeGroup = Trees 10次就是這樣做的10倍。你是而不是使用循環變體。循環中唯一修改的內容。即便如此,這整塊代碼也沒用。

while keepgoing: 

    for event in pygame.event.get(): 
     if event.type==pygame.QUIT: 
     keepgoing=False 

這會導致一個很好的無限循環。它不斷評估持續變量。除非用戶退出,否則它將永遠不會設置爲false,而且也不會在屏幕上顯示任何內容。失去這個。改爲:

for event in pygame.event.get(): 
    if event.type == QUIT: 
     return 

這不會導致無限循環,因爲每個滴答只處理很多事件。然後該程序將循環並執行該過程或更新,渲染並再次獲取輸入。

+0

對不起!我有一個'樹'的拼寫錯誤應該是'樹' – Todd 2011-03-05 00:37:38

+0

樹是,列出這就是爲什麼我把它大寫;我會盡量讓自己的變量更加清晰,就像while循環一樣,我只是關閉窗口來停止。我知道Treegroup沒有做任何事情,我應該在發佈前刪除它;只是最後一分鐘的實驗。 – Todd 2011-03-05 00:52:45

1

據我瞭解你想達到什麼,下面的代碼應該可以幫到你。對於Python語法,我保持非常簡單,因爲你似乎是一個新手(對於有經驗的程序員:是的,我在下面寫的是可怕的Python代碼,但我相信OP可以理解它,它可能會有所幫助)。

關鍵是如果你想獲得幾組樹,你必須在一個循環內有一個循環。內部循環將樹放入組中,外部循環放置幾組。當然,你可以(也應該)隱藏某個函數或類的內部循環。

# Howmany groups ? say 3 
trees_groups = [] 
number_of_groups = 3 
for _ in range(number_of_groups): 
    # Choose a base position for my group of trees 
    base_x = random.randrange(0,530) 
    base_y = random.randrange(0,370) 
    # Makes a group of trees 
    trees=[] 
    number_of_trees = random.randrange(5,10) 
    for _ in range(number_of_trees): 
     one_tree = Tree1() 
     trees.append(one_tree) 
    for tree in trees: 
     tree.rect.centerx += base_x 
     tree.rect.centery += base_y 
     trees_groups.append(tree) 


# Places groups 
PlayerSprite=pygame.sprite.Group(trees_groups) 

一些注意事項後:

  • 正如其他海報說,你做你不應該使用大寫變量。 Python的使用是爲了保持它們的類
  • 當不使用基本變體時使用範圍循環也是不好的做法。我沒有使用下劃線作爲循環變體的變量名,我強調了這一點。
1

我會用randintmove_ip來得到你想要的。下面是我自己的遊戲的代碼片段的作品一樣好:

self.rect.move_ip(random.randint(minX, maxX), random.randint(minY, maxY)) 

四個變量了minX,maxX的,MINY,美星形式,其中精靈可以放置一個矩形。在你的情況下,樹會沿着整個屏幕放置,但減少了最大X和Y範圍,所以樹不會通過屏幕底部剪輯。

此外,使用Group類來存儲您的樹,而不是一個列表。列表將停止多棵樹的產卵,而Group會。下面是如何稱呼它:

Treegroup = pygame.sprite.Group

和一個精靈添加到組:

Treegroup.add(Tree1(screen))

確保類本身有屏幕的初始化,像這樣:

def __init__(self, screen)

一旦完成,你的代碼應該看起來像這樣:

for Treegroup in range(10): 
    Treegroup.add(Tree(screen)) 
[...] 
class Tree(pygame.sprite.Sprite): 
    def __init__(self, screen): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image('tree.png', -1) 
     self.rect.move_ip(random.randint(0, 800), random.randint(0, 600)) 
     self.area = screen.get_rect()