效果图如下:
1.创建 bug_alien.py
import pygame
from pygame.sprite import Sprite
class Bug_alien(Sprite):
"""表示单个外星人的类。"""
def __init__(self, ai_game):
"""初始化外星人并设置其起始位置。"""
super().__init__()
self.screen = ai_game.screen
# 加载外星人图像并设置其rect属性。
self.image = pygame.image.load('images/bug_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)
2.修改 alien_invasion.py
1)增加 import语句
from bug_alien import Bug_alien
2)增加 __init__() 方法里的语句
self.bug_aliens = pygame.sprite.Group() self._create_fleet()
3)编写新方法 _create_fleet()
def _create_fleet(self):
"""创建外星人群。"""
# 创建一个外星人并计算一行可容纳多少个外星人。
# 外星人的间距为外星人的宽度。
bug_alien = Bug_alien(self)
bug_alien_width, bug_alien_height = bug_alien.rect.size
available_space_x = self.settings.screen_width - (2 * bug_alien_width)
number_bug_aliens_x = available_space_x // (2 * bug_alien_width)
# 计算屏幕可容纳多少行外星人。
ship_height = self.ship.rect.height
available_space_y = (self.settings.screen_height - (3 * bug_alien_height) - ship_height)
number_rows = available_space_y // (2 * bug_alien_height)
# 创建外星人群
for row_number in range(number_rows):
for bug_alien_number in range(number_bug_aliens_x):
self._create_bug_alien(bug_alien_number, row_number)
4)修改方法 _update_screen() ,增加语句
self.bug_aliens.draw(self.screen)
5)编写新方法 _create_bug_alien()
def _create_bug_alien(self, bug_alien_number, row_number):
# 创建一个外星人并将其加入当前行。
bug_alien = Bug_alien(self)
bug_alien_width, bug_alien_height = bug_alien.rect.size
bug_alien.x = bug_alien_width + 2 * bug_alien_width * bug_alien_number
bug_alien.rect.x = bug_alien.x
bug_alien.rect.y = bug_alien.rect.height + 2 * bug_alien.rect.height * row_number
self.bug_aliens.add(bug_alien)