Pygame:放置多个对象时出错:(

时间:2013-09-22 22:24:59

标签: python pygame

所以我开始用Python / 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()

每次我去第二个街区时......我都会收到此错误:

Traceback(最近一次调用最后一次):文件 “C:\ Users \ samis_000 \ Desktop \ blockgame.pyw”,第20行,in blocklist.append(block(mse [0],mse [1]))TypeError:'block'对象不可调用

有人告诉我我做错了什么:(

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您将块类大写(例如class Block(object)),您可能会解决此问题。这是因为这段代码

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

也使用小写block,因为将来调用block会对你是否正在讨论用块类(你有小写)或{{1}创建一个新块感到困惑。你已经(重新)在循环中定义了。

此外,我同意Samuele的评论,你应该在适当的地方使用block,但我不能从你的片段中看出是否也会引起问题。