Pygame中的 AttributeError: 'Group' object has no attribute 'rect

#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)

再将模块中的参数和主程序中的参数做相应的调整,这个报错就顺利解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值