我最近一直在设计游戏,因为我正在学校开始上课 并认为获得成功会有所帮助。
我遇到了错误
Traceback (most recent call last):
File "C:\Users\Jake\Documents\Dungeon Crawler 2.1\Main.py", line 100, in <module>
town()
File "C:\Users\Jake\Documents\Dungeon Crawler 2.1\Main.py", line 85, in town
houseSpr1(0,250)
TypeError: 'pygame.Surface' object is not callable
执行此代码时。
def town ():
global outTown
while not outTown:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
print (event)
mx, my = pygame.mouse.get_pos()
mx = mx + my
if 375 <= mx <= 448:
outTown = True
print ("OK!")
if event.type == pygame.QUIT:
pygame.quit()
quit()
houseSpr1 = pygame.image.load ('houseD.png') # default house img
houseSpr1(0,250)
gameDisplay.fill(green) # background
pygame.draw.rect(gameDisplay,grey,(0,400,1280,50)) # main path
pygame.draw.rect(gameDisplay,grey,(200,125,50,280)) # branch path
player(x,y)
pygame.display.update()
clock.tick(60)
def houseSpr1(a,b):
gameDisplay.blit(houseSpr1, (0,250))
def house1():
global outHouse
while not outHouse:
gameDisplay.fill(black)
town()
houseSpr1()
gameIntro()
house1()
pygame.quit()
quit()
我理解这段代码在某些方面可能效率低下,如果您希望在这方面提供见解,我会很高兴知道如何改进它。
对此错误的任何帮助将不胜感激。是的,在我之前我已经阅读了其余的问题,我看到它主要是印刷错误,但我在这里看不到任何问题。
答案 0 :(得分:2)
您使用名称houseSpr1
进行了两件事:
def houseSpr1(a,b): ...
houseSpr1 = pygame.image.load ('houseD.png')
。这两个名称不是独立的。函数只是Python中的另一种类型的对象,它们只是像任何其他变量一样存储。
当您使用表达式houseSpr1(0,250)
时,Python将其视为:
houseSpr1
0
和250
(两个整数对象)因为您在houseSpr1
函数中为名称town()
分配了一些内容,所以该对象,即加载的图像,Python试图调用。 PyGame使用名为Surface
的对象类型来加载图像,错误告诉您尝试调用该对象,但该对象不支持被调用。
解决方案是不使用相同的名称:
houseSpr1Image = pygame.image.load('houseD.png')
houseSpr1(0, 250)
您还必须调整houseSpr1
功能:
def houseSpr1(a,b):
gameDisplay.blit(houseSpr1Image, (0,250))
你这里还有其他问题; houseSpr1Image
不是全局的,因此houseSpr1()
函数找不到它,会给您NameError
例外。您还忽略了函数的a
和b
参数,并在那里对0,250
进行了硬编码。您必须解决这些问题才能使代码生效。也许你可以采用第三个参数image
:
def houseSpr1(image, a, b):
gameDisplay.blit(image, (a, b))
并传入图像表面:
houseSpr1Image = pygame.image.load('houseD.png')
houseSpr1(houseSpr1Image, 0, 250)
答案 1 :(得分:0)
Martijn Pieters已经详细解释了为什么你的代码不起作用。这是一个简洁的程序版本,可以向您展示它应该是什么样子。
实际上,blit_houseSpr1
函数不是必需的,因为您也可以在主循环中调用gameDisplay.blit(houseSpr1, (80, 250))
,但我只是想演示如何使用函数并将一些参数传递给它
import pygame
pygame.init()
gameDisplay = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
green = pygame.Color('green4')
grey = pygame.Color('grey50')
# Load the images once, because loading them from the hard disk is slow.
# And use the convert or convert_alpha methods to improve the performance.
houseSpr1 = pygame.image.load('houseD.png').convert()
def town():
outTown = False
while not outTown:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
mx, my = pygame.mouse.get_pos()
mx = mx + my
if 375 <= mx <= 448:
outTown = True
elif event.type == pygame.QUIT:
outTown = True
gameDisplay.fill(green) # background
pygame.draw.rect(gameDisplay,grey,(0,400,1280,50)) # main path
pygame.draw.rect(gameDisplay,grey,(200,125,50,280)) # branch path
# Pass the image and the coordinates to the function.
blit_houseSpr1(houseSpr1, 80, 250)
pygame.display.update()
clock.tick(60)
def blit_houseSpr1(image, a, b):
# Now use the passed image and coordinates.
gameDisplay.blit(image, (a, b))
town()
pygame.quit()