2

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

每次我去放置第二个块..我得到这个错误:

回溯(最近一次调用):文件“C:\Users\samis_000\Desktop\blockgame.pyw”,第 20 行,在 blocklist.append(block(mse[0],mse[1])) 类型错误:'block'对象不可调用

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

4

2 回答 2

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 类声明中用于加载图像的奇怪逻辑。

于 2013-09-22T23:02:03.273 回答
1

如果你大写你的块类(例如class Block(object))你可能会解决这个问题。这是因为这段代码

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

也使用小写block,使将来的调用block混淆您是在谈论使用块类(您有小写字母)还是block您在循环中(重新)定义的新块。

另外,我同意 Samuele 的评论,您应该self在适当的地方使用您的班级,但我无法从您的片段中判断这是否也会导致问题。

于 2013-09-22T22:28:47.357 回答