所以我开始用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'对象不可调用
有人告诉我我做错了什么:(
答案 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
,但我不能从你的片段中看出是否也会引起问题。