解决python入门与实践 出现'Group' object has no attribute 'get_rect

题目描述

get_rect()应该是pygame中的一种方法,为什么不能使用?而是被当成Group()中的变量

题目来源及自己的思路

已经将所有函数和类合并,直接复制运行即可,请大神解答一下

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
alien_invasion.py(主程序)

import sys
import pygame
from pygame.sprite import Sprite
from pygame.sprite import Group
import game_functions as gf



class Settings():
    
    
    def __init__(self):

        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230,230,230)
        self.ship_speed_factor = 2.5
        self.bullet_speed_factor = 1
        self.bullet_width = 3
        self.bullet_height = 10
        self.bullet_color = 60,60,60
        self.bullets_allowed = 3
        self.alien_speed_factor = 1
        self.fleet_drop_speed = 10
        self.fleet_direction = 1

class Ship:
    
    def __init__(self,ai_settings,screen):
        self.screen = screen
        self.ai_settings = ai_settings
      
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

class Bullet(Sprite):
    # 对飞行子弹的管理
    def __init__(self,ai_settings,screen,ship):
        # 在飞船所处位置创建子弹
        super(Bullet,self).__init__()
        self.screen =screen

class Alien(Sprite):
    
    def __init__(self,ai_settings,screen):
        super(Alien,self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings
        
        # 加载图片确认rect
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()
        
        # 每个外星人在屏幕左上角
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
        
        # 存储外星人的位置
        self.x = float(self.rect.x)
       
    def blitme(self):
        self.screen.blit(self.image,self.rect)
        
    def update(self):
        self.x += self.ai_settings.alien_speed_factor
        self.rect.x = self.x
     
    def check_edges(self):
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right:
            return True
        elif self.rect.left <= 0:
            return True
    
    def update(self):
        self.x += (self.ai_settings.alien_speed_factor *
                   self.ai_settings.fleet_direction)
        self.rect.x = self.x
        
def get_number_aliens_x(ai_settings,alien_width):
    avaliable_space_x = ai_settings.screen_width - 2 * alien_width
    number_aliens_x = int(avaliable_space_x / (2 * alien_width))
    return number_aliens_x

def get_number_rows(ai_settings,ship_height,alien_height):
    avaliable_space_y = (ai_settings.screen_height - 
                         (3 * alien_height) - ship_height)
    number_rows = int(avaliable_space_y / (2 * alien_height))
    return number_rows

def create_alien(ai_settings,screen,aliens,alien_number,row_number):
    alien = Alien(ai_settings,aliens)
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width *alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    aliens.add(alien)  
 
def create_fleet(ai_settings, screen, ship, aliens):
    # 创建一个外星人,并计算一行有几个外星人
    alien = Alien(ai_settings,screen)
    number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
    number_rows = get_number_rows(ai_settings, ship.rect.height,
                                  alien.rect.height)
    # 创建第一行外星人
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(ai_settings, screen, aliens, alien_number,
                         row_number)
          
def check_fleet_edges(ai_settings, aliens):

    for alien in aliens.sprites():
        if alien.check_edges():
           change_fleet_direction(ai_settings, aliens)
           break
       
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("Alien Invasion")
    # 创建一个飞船
    ship = Ship(ai_settings,screen)
    # 创建一个用于储存子弹的编组和一个外星人编组
    bullets = Group()
    aliens = Group()
    # 创建外星人群
    gf.create_fleet(ai_settings,screen,ship,aliens)
    # 开始游戏主循环
    while True:
       
       gf.update_aliens(ai_settings,aliens)
      
    
run_game()

你期待的结果是什么?实际看到的错误信息又是什么?

可以直接运行方法get_rect()
实际看到:

 File "D:/python/alien_invasion/untitled0.py", line 145, in <module>
    run_game()

  File "D:/python/alien_invasion/untitled0.py", line 142, in run_game
    gf.update_aliens(ai_settings,aliens)

  File "D:\python\alien_invasion\game_functions.py", line 112, in update_aliens
    check_fleet_edges(ai_settings, aliens)

  File "D:\python\alien_invasion\game_functions.py", line 101, in check_fleet_edges
    if alien.check_edges():

  File "D:\python\alien_invasion\alien.py", line 37, in check_edges
    screen_rect = self.screen.get_rect()
阅读 5.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题