#Pygame中的 AttributeError: ‘Group’ object has no attribute 'rect’
在使用Pygame编写程序时,会需要检测两个物体碰撞,如果这两个物体的一个是精灵(单个物体),一个是组,会使用到函数pygame.sprite.spritecollideany(a, b),这个函数的两个参数是有位置要求的,第一个a是精灵,第二个b是组。如果位置不对,很可能会出现如下报错:
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "hold_ball.py", line 33, in <module>
run_game()
File "hold_ball.py", line 29, in run_game
gf.check_collide(ai_settings, screen, balls, basket)
File "F:\Python编程\Python从入门到实践\第十三章\homework135\game_function.py", line 59, in check_collide
if pygame.sprite.spritecollideany(balls, basket):
File "C:\Users\Maike\AppData\Roaming\Python\Python36\site-packages\pygame\sprite.py", line 1597, in spritecollideany
spritecollide = sprite.rect.colliderect
AttributeError: 'Group' object has no attribute 'rect'
模块中的子代码原来是这样的:
def check_collide(ai_settings, screen, balls, basket):
"""检查篮子是否与红球相撞"""
ball = Ball(ai_settings, screen)
if pygame.sprite.spritecollideany(balls, basket):
creat_new_ball(ai_settings, screen, balls)
主程序如下:
import pygame
from pygame.sprite import Group
from ball_settings import Settings
from basket import Basket
from ball import Ball
import game_function as gf
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,
ai_settings.screen_height))
pygame.display.set_caption("Hold Ball")
#创建一个篮子
basket = Basket(ai_settings, screen)
# 创建一个编组用来存储红球
balls = Group()
#创建红球
gf.creat_new_ball(ai_settings, screen, balls)
# 开始游戏主循环
while True:
gf.check_events(basket)
basket.update()
gf.check_collide(ai_settings, screen, balls, basket)
gf.update_balls(balls)
gf.update_screen(ai_settings, screen, basket, balls)
run_game()
这个时候运行主程序就会报上面的错。因为basket是单个物体,而balls是组,它们的位置是反的。
解决这个问题的办法就是把函数pygame.sprite.spritecollideany(a, b)中的两个参数的位置调换过来,修改后如下:
def check_collide(ai_settings, screen, basket, balls):
"""检查篮子是否与红球相撞"""
ball = Ball(ai_settings, screen)
if pygame.sprite.spritecollideany(basket, balls):
creat_new_ball(ai_settings, screen, balls)
再将模块中的参数和主程序中的参数做相应的调整,这个报错就顺利解决。