对方法的引用未解析,但是可以运行

可以运行但是他说我未解析
为什么类 'Sprite' 的属性引用 'draw_bullet' 未解析,bullet里面的方法draw_bullet

img

img

import sys
import pygame
"""为了访问settings,ship的属性,调用settings和ship的方法"""
from settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Aline


class AlienInvasion:
    def __init__(self):
        """初始化游戏"""
        pygame.init()
        """把settings的属性取出来放到self.settings实例"""
        self.settings = Settings()
        """游戏的边框以及游戏名及颜色"""
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height)
                                             )
        pygame.display.set_caption("武装飞机")
        """把ship的属性取出,放到self.ship,注意括号不能丢掉,丢掉取不出来"""
        self.ship = Ship(self)
        """bullet 运用了父类继承的方法 在sprite里建立了精灵"""
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()
        self.bg_color = self.settings.bg_color

    def run_game(self):
        """游戏开始循环"""
        while True:
            """按键检测"""
            self._check_events()
            """飞机的位置更新"""
            self.ship.update()
            """子弹的位置更新"""
            self._update_bullets()
            """外星人位置更新"""
            self._update_aliens()
            """屏幕的刷新"""
            self._update_screen()

    def _check_events(self):
        """监视键盘和鼠标事件,pygame.event.get()和pygame.key.get_pressed()两种,这里选第一种"""
        for event in pygame.event.get():
            """event.type"""
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                """检测按键被按下并修改ship里的属性"""
                if event.key == pygame.K_d:
                    self.ship.moving_right = True
                elif event.key == pygame.K_a:
                    self.ship.moving_left = True
                elif event.key == pygame.K_w:
                    self.ship.moving_up = True
                elif event.key == pygame.K_s:
                    self.ship.moving_down = True
                    """检测按键q被按下调用 '_fire_bullet' 创建子弹"""
                elif event.key == pygame.K_p:
                    self._fire_bullet()
                    """创建一个新的退出程序的方法"""
                elif event.key == pygame.K_q:
                    sys.exit()

            elif event.type == pygame.KEYUP:
                """检测按键被松开并修改ship里的属性"""
                if event.key == pygame.K_d:
                    self.ship.moving_right = False
                elif event.key == pygame.K_a:
                    self.ship.moving_left = False
                elif event.key == pygame.K_w:
                    self.ship.moving_up = False
                elif event.key == pygame.K_s:
                    self.ship.moving_down = False

    def _update_screen(self):
        self.screen.fill(self.bg_color)
        self.ship.blitme()
        """ 'bullets.sprites' 返回一个列表,其中包括bullet的所有精灵 """
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
            """ draw() 把每个属性绘制到self.screen"""
        self.aliens.draw(self.screen)
        """刷新屏幕"""
        pygame.display.flip()

    def _update_aliens(self):
        self._check_fleet_edges()
        self.aliens.update()

    def _check_fleet_edges(self):
        """检查有没有外星人到达边界"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._check_fleet_direction()

    def _check_fleet_direction(self):
        for alien in self.aliens.sprites():
            """调用一群外星人向下移动"""
            alien.rect.y += self.settings.fleet_drop_speed
            """只要一个移动方向故没有放到for语句,放到for里会出现奇怪的问题"""
        self.settings.fleet_drection *= -1

    def _fire_bullet(self):
        """创建一个新的子弹用add()加入到'bullets'类似于 append()"""
        if len(self.bullets) <= self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        self.bullets.update()
        """先用.copy()复制bullets里的精灵,在用if语句判断是否需要删除,删除后查看bullets的长度并显示"""
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

        pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
        """检查还有没有外星人"""
        if not self.aliens:
            """删除子弹,添加新的外星人"""
            self.bullets.empty()
            self._create_fleet()

    def _create_fleet(self):
        """创建外星人群"""
        """for 以前的语句是判断一行能容纳多少外星人"""
        alien = Aline(self)
        alien_width = alien.rect.width
        alien_height = alien.rect.height
        ship_height = self.ship.rect.height
        """这里不能直接self.screen.rect.width而是self.settings.screen_width
        因为没有用语句get_rect获得其外接矩形"""
        available_space_y = self.settings.screen_height-(3*alien_height)-ship_height
        number_rows = available_space_y//(2*alien_height)
        available_space_x = self.settings.screen_width-(2*alien_width)
        number_aliens_x = available_space_x//(2*alien_width)
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_aluen(row_number, alien_number)

    def _create_aluen(self, number_rows, alien_number):
        """容纳的外星人个数得到后逐一添加到aliens里"""
        alien = Aline(self)
        alien_width = alien.rect.width
        alien_height = alien.rect.height
        alien.x = alien_width+2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien_height + 2 * alien_height * number_rows
        self.aliens.add(alien)


"""检查程序入口"""
if __name__ == '__main__':
    """导入类"""
    ai = AlienInvasion()
    """运行run_game"""
    ai.run_game()



```python
import pygame
"""使用精灵(sprite),相关元素编组"""
from pygame.sprite import Sprite


class Bullet(Sprite):
    def __init__(self, ai_game):
        """先初始化一个空的精灵组"""
        """在飞船当前位置创建一个子弹的类"""
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        """这里先获得了子弹的颜色"""
        self.color = self.settings.bullet_color
        """要先在(0,0)处创建一个表示子弹的矩形"""
        self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)
        """放到正确的位置"""
        self.rect.midtop = ai_game.ship.rect.midtop
        """用'self.y'储存有小数的'self.rect.y' """
        self.y = float(self.rect.y)

    def update(self):
        """当按下一个按键在组里放一个精灵, 'update' 对每个精灵的位置进行调整 """
        self.y -= self.settings.bullet_speed
        self.rect.y = self.y

    def draw_bullet(self):
        """draw.rect的用法 储存三个数据 分别为 屏幕的数据 子弹的颜色 和子弹的对角坐标(及子弹覆盖的面积与覆盖的位置) 然后把子弹代替屏幕显示"""
        pygame.draw.rect(self.screen, self.color, self.rect)

```

在alien文件import bullet文件了吗?

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^