创建第一个外星人

在屏幕上放置一个外星人就像在屏幕上放置一艘船一样 每个外星人的行为都由一个名为 Alien 的类控制,我们将其结构与 Ship 类类似。为了简单起见,我们将继续使用位图图像。您可以找到自己的外星人图像,也可以使用图 13-1 中所示的图像,该图像可以在本书的资源中找到: https://ehmatthes.github.io/pcc_3e 。该图像具有灰色背景,与屏幕的背景颜色相匹配。确保将选择的图像文件保存在图像文件夹中。

image 2023 06 23 21 59 19 960
Figure 1. The alien we’ll use to build the fleet

创建Alien类

现在我们将编写 Alien 类并将其保存为 alien.py:

alien.py
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    """A class to represent a single alien in the fleet."""
    def __init__(self, ai_game):
        """Initialize the alien and set its starting position."""
        super().__init__()
        self.screen = ai_game.screen

        # Load the alien image and set its rect attribute.
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()
        # Start each new alien near the top left of the screen.
        self.rect.x = self.rect.width (1)
        self.rect.y = self.rect.height

        # Store the alien's exact horizontal position.
        self.x = float(self.rect.x) (2)

除了外星人在屏幕上的位置之外,该类的大部分内容都类似于 Ship 类。 我们最初将每个外星人放置在屏幕的左上角附近; 我们在其左侧添加一个等于外星人宽度的空格,并在其上方添加一个等于其高度❶的空格,因此很容易看到。我们主要关心外星人的水平速度,因此我们将精确跟踪每个外星人的水平位置❷。

这个 Alien 类不需要将其绘制到屏幕上的方法;相反,我们将使用 Pygame 组方法自动将组中的所有元素绘制到屏幕上。

创建Alien实例

我们想要创建一个 Alien 实例,以便我们可以在屏幕上看到第一个外星人。 因为这是我们设置工作的一部分,所以我们将在 AlienInvasion 中的 __init__() 方法末尾添加此实例的代码。 最终,我们将创建一整支外星人舰队,这将是一项艰巨的工作,因此我们将创建一个名为 _create_fleet() 的新辅助方法。

类中方法的顺序并不重要,只要它们的放置方式具有一定的一致性即可。 我将把 _create_fleet() 放在 _update_screen() 方法之前,但 AlienInvasion 中的任何地方都可以。首先,我们将导入 Alien 类。

以下是 Alien_invasion.py 的更新 import 语句:

alien_invasion.py
--snip--
from bullet import Bullet
from alien import Alien

这是更新后的 __init__() 方法:

alien_invasion.py
def __init__(self):
    --snip--
    self.ship = Ship(self)
    self.bullets = pygame.sprite.Group()
    self.aliens = pygame.sprite.Group()

    self._create_fleet()

我们创建一个组来容纳外星人舰队,并调用我们即将编写的 _create_fleet()

这是新的 _create_fleet() 方法:

alien_invasion.py
def _create_fleet(self):
    """Create the fleet of aliens."""
    # Make an alien.
    alien = Alien(self)
    self.aliens.add(alien)

在此方法中,我们创建一个 Alien 实例,然后将其添加到将容纳舰队的组中。外星人将被放置在屏幕的默认左上角区域。

为了让外星人出现,我们需要在 _update_screen() 中调用该组的 draw() 方法:

alien_invasion.py
def _update_screen(self):
    --snip--
    self.ship.blitme()
    self.aliens.draw(self.screen)

    pygame.display.flip()

当您在组上调用 draw() 时,Pygame 会在其 rect 属性定义的位置绘制组中的每个元素。 draw() 方法需要一个参数:一个用于绘制组中元素的表面(surface)。 图 13-2 显示了屏幕上的第一个外星人。

image 2023 06 23 22 10 03 583
Figure 2. The first alien appears.

现在第一个外星人正确出现了,我们将编写代码来绘制整个舰队。