2013-09-22 45 views
2

所以我開始編程一個小塊放置在Python/pygame遊戲 我寫了代碼,理論上它看起來很完美..它應該能夠放置多個塊。鼠標按下下面是代碼:Pygame:錯誤與放置多個對象:(

import pygame 
from pygame.locals import * 
pygame.init() 
screen=pygame.display.set_mode((640,480),0) 
blocklistDIRT=[] 
class block(object): 

    sprite = None 

    def __init__(self, x, y): 
     if not block.sprite: 
      block.sprite = pygame.image.load("dirt.png").convert_alpha() 
     self.rect = block.sprite.get_rect(top=y, left=x) 

blocklist = []  
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.MOUSEBUTTONUP: 
      mse=pygame.mouse.get_pos() 
      blocklist.append(block(mse[0],mse[1])) 
     if event.type == QUIT: 
      exit() 
    for block in blocklist: 
     screen.blit(block.sprite, block.rect) 
    pygame.display.update() 

而且我每次去放置第二塊的時間。我得到這個錯誤:

回溯(最近通話最後一個):文件 「 C:\ Users \ samis_000 \ Desktop \ blockgame.pyw「,第20行,在 blocklist.append(block(mse [0],mse [1]))TypeError:'block'對象是不可調用的

有人告訴我,我做錯了:(

+1

在您的塊.__ init__中,替換塊的所有發生。與自我。 :D –

+0

爲了避免爲同一個精靈分配多個內存,可以使用工廠類來檢索精靈數據。通過使用一個通用的工廠結構,您可以避免爲您擁有的每個遊戲實體編寫相同的控件(__init__中的if子句)。 – diegoperini

+0

把他們都改成了自己,那也沒用。還是一樣的錯誤!而@diegoperini請進一步解釋你的方法。 –

回答

2

所有類的聲明都應該按照慣例大寫。另外,當你調用一個類的構造函數時,這個名稱應該與該類的大寫名稱匹配。這裏是你的代碼應該工作的一個版本:

import pygame 
from pygame.locals import * 
pygame.init() 
screen=pygame.display.set_mode((640,480),0) 
blocklistDIRT=[] 
class Block(object): 

    sprite = pygame.image.load("dirt.png").convert_alpha() 

    def __init__(self, x, y): 
     self.rect = block.sprite.get_rect(top=y, left=x) 

blocklist = []  
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.MOUSEBUTTONUP: 
      mse=pygame.mouse.get_pos() 
      blocklist.append(Block(mse[0],mse[1])) 
     if event.type == QUIT: 
      exit() 
    for block in blocklist: 
     screen.blit(block.sprite, block.rect) 
    pygame.display.update() 

看看如何在代碼中,大寫的單詞用藍色突出顯示?這是因爲它們是類名,它們與您的實例名稱不同。

我還冒昧地刪除了您在Block類聲明中加載圖像的奇怪邏輯。

+1

非常感謝你!!我不得不用「self.sprite.get_rect」代替「block.sprite.get_rect」,但它的工作! –

+0

@Sam woops,甚至沒有看到。:)很好的捕獲。 – Shashank

+0

大聲笑。謝謝你的幫助。我對Pygame很新鮮。 –

1

如果你的資本類塊(例如class Block(object))你可能會解決這個問題。這是因爲這段代碼

for block in blocklist: 
    screen.blit(block.sprite, block.rect) 

也使用小寫block,使未來的呼叫block弄不清楚你是否在談論與塊類創建一個新的塊(你有小寫)或block你」 ve(重新)在循環中定義。

另外,我同意Samuele的評論,你應該在適當的地方使用self,但是我無法從你的片段中知道這是否也會導致問題。

+0

讓我試試吧!謝謝:) –

+1

這是常見的做法,capiltize類名稱如「ThisIsMyNewAwesomeClass」。 – diegoperini

+0

大寫'塊'的所有用途,我仍然有錯誤:(任何更多的建議? –