Python/Pygame: 类型错误:'模块'对象不可调用
我的Pygame代码出现了一个错误,错误信息是:
apple.rect=pygame.rect(apple_x,apple_y,32,37)
TypeError: 'module' object is not callable
我的完整代码如下:
import sys, pygame, random
from menu_lib import *
from credit import credit
class Player(pygame.sprite.Sprite):
def __init__(self, *groups):
super(Player, self).__init__(*groups)
self.image = pygame.image.load('catcher_left.png')
self.rect = pygame.rect.Rect((320,240), self.image.get_size())
self.rect.bottom = 452
self.rect.left = 320
def update(self):
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.rect.x -= 10
self.image = pygame.image.load('catcher_left.png')
pygame.display.flip()
if key[pygame.K_RIGHT]:
self.rect.x += 10
self.image = pygame.image.load('catcher_right.png')
pygame.display.flip()
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > 640:
self.rect.right = 640
if self.rect.colliderect(apple.rect):
print "Collided!"
class Game(object):
def main(self, screen):
clock = pygame.time.Clock()
background = pygame.image.load('background.jpg')
background = pygame.transform.scale(background, (640, 480))
apple = pygame.image.load('apple.png')
apple_x=0
apple_y=0
apple_count=0
sprites = pygame.sprite.Group()
self.player = Player(sprites)
while 1:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
screen.fill((0,0,0))
pygame.display.flip()
Mainmenu()
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
screen.fill((0,0,0))
pygame.display.flip()
Mainmenu()
if apple_y==0:
apple_y+=10
apple_x=random.randint(10, 630)
apple_count+=1
elif apple_y!=0 and apple_y<480:
apple_y+=10
elif apple_y>=480:
apple_y=0
apple_x=0
apple.rect=pygame.rect(32,37,apple_x,apple_y)
sprites.update()
screen.fill((200, 200, 200))
screen.blit(background, (0, 0))
sprites.draw(screen)
score_txt='Score: '+str(apple_count)
label = myfont.render(score_txt, 1, (255,0,0))
screen.blit(label, (500, 10))
screen.blit(apple, (apple_x,apple_y))
pygame.display.flip()
def Mainmenu():
screen = pygame.display.set_mode((640, 480))
menu = cMenu(50, 50, 20, 5, 'vertical', 300, screen,
[('Start Game', 1, None),
('Credits', 2, None),
('Exit', 3, None)])
menu.set_center(True, True)
menu.set_alignment('center', 'center')
state = 0
prev_state = 1
rect_list = []
pygame.event.set_blocked(pygame.MOUSEMOTION)
while 1:
key = pygame.key.get_pressed()
if key[pygame.K_ESCAPE]:
pygame.quit()
sys.exit()
if prev_state != state:
pygame.event.post(pygame.event.Event(EVENT_CHANGE_STATE, key = 0))
prev_state = state
e = pygame.event.wait()
if e.type == pygame.KEYDOWN or e.type == EVENT_CHANGE_STATE:
if state == 0:
rect_list, state = menu.update(e, state)
elif state == 1:
screen = pygame.display.set_mode((640, 480))
Game().main(screen)
elif state == 2:
credits()
else:
print 'Exit!'
pygame.quit()
sys.exit()
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.update(rect_list)
def credits():
clock = pygame.time.Clock()
screen=pygame.display.set_mode((640,480))
screen.fill((0, 0, 0))
text = "Credits \n _ _ _ _ _ _ _ _ _ _ _ _ \n\n\n Designer \n Creator \n\n Manikiran P"
color = 0xa0a0a000
credit(text,myfont,color)
Mainmenu()
while 1:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
screen.fill((0,0,0))
pygame.display.flip()
Mainmenu()
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
screen.fill((0,0,0))
pygame.display.flip()
Mainmenu()
pygame.display.flip()
if __name__ == '__main__':
pygame.init()
screen=pygame.display.set_mode((640,480))
pygame.display.set_caption("Evenure - (c) 2014")
myfont = pygame.font.Font("captureit.ttf", 20)
apple_x=0
apple_y=0
apple = pygame.image.load('apple.png')
Mainmenu()
我想创建一个苹果的矩形,用来检测碰撞,但结果却出现了上面的错误。如果我把矩形和碰撞的相关代码去掉,程序就能正常运行。希望能尽快得到解决方案。谢谢!
1 个回答
2
你需要使用 pygame.Rect()
(注意大写的 R);而 pygame.rect
是一个模块,用来定义 Rect
这个类型,但它在顶层模块中也可以使用。
在某个地方你用得是对的:
self.rect = pygame.rect.Rect((320,240), self.image.get_size())
把出问题的那一行改成:
apple.rect = pygame.Rect(32, 37, apple_x, apple_y)
或者
apple.rect = pygame.rect.Rect(32, 37, apple_x, apple_y)
不过,apple
是一个 Surface
对象,它并没有 rect
这个属性,所以这样会报错。
也许你是想裁剪这个图像?可以用 Surface.set_clip()
来实现。
如果你希望一个 Surface
对象像一个精灵那样工作,那么你首先需要创建一个真正的精灵对象。如果你还不知道怎么创建精灵,建议你先了解一下精灵的相关知识: