13.2 创建第一个外星人
在屏幕上放置外星人与放置飞船类似。每个外星人的行为都由Alien 类控制,我们将像创建Ship 类那样创建这个类。出于简化考虑,也将使用位图来表示外星人。你可以自己寻找表示外星人的图像,也可以使用如图13-1所示的图像,它可在本书配套资源(ituring.cn/book/2784)中找到。这幅图像的背景为灰色,与屏幕背景色一致。请务必将选择的图像文件保存到文件夹images中。
图13-1 用来创建外星人群的外星人图像
13.2.1 创建Alien 类
下面来编写Alien 类并将其保存为文件alien.py:
alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""表示单个外星人的类。"""
def init(self, aigame):
"""初始化外星人并设置其起始位置。"""
super()._init()
self.screen = ai_game.screen
# 加载外星人图像并设置其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)
除位置不同外,这个类的大部分代码与Ship 类相似。每个外星人最初都位于屏幕左上角附近。将每个外星人的左边距都设置为外星人的宽度,并将上边距设置为外星人的高度(见❶),这样更容易看清。我们主要关心的是外星人的水平速度,因此精确地记录了每个外星人的水平位置(见❷)。
Alien 类不需要一个在屏幕上绘制外星人的方法,因为我们将使用一个Pygame编组方法,自动在屏幕上绘制编组中的所有元素。
13.2.2 创建Alien 实例
要让第一个外星人在屏幕上现身,需要创建一个Alien 实例。这属于设置工作,因此将把这些代码放在AlienInvasion 类的方法init() 末尾。我们最终会创建一群外星人,涉及的工作量不少,因此将新建一个名为createfleet() 的辅助方法。
在类中,方法的排列顺序无关紧要,只要按统一的标准排列就行。我们将把createfleet() 放在updatescreen() 前面,不过放在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.createfleet()
创建了一个用于存储外星人群的编组,还调用了接下来将编写的方法createfleet() 。
下面是新编写的方法createfleet() :
alien_invasion.py
def createfleet(self):
"""创建外星人群。"""
# 创建一个外星人。
alien = Alien(self)
self.aliens.add(alien)
在这个方法中,创建了一个Alien 实例,再将其添加到用于存储外星人群的编组中。外星人默认放在屏幕左上角附近,对第一个外星人来说,这样的位置非常合适。
要让外星人现身,需要在updatescreen() 中对外星人编组调用方法draw() :
alien_invasion.py
def updatescreen(self):
—snip—
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.aliens.draw(self.screen)
pygame.display.flip()
对编组调用draw() 时,Pygame将把编组中的每个元素绘制到属性rect 指定的位置。方法draw() 接受一个参数,这个参数指定了要将编组中的元素绘制到哪个surface上。图13-2显示了在屏幕上现身的第一个外星人。
图13-2 第一个外星人现身
第一个外星人正确地现身了,下面来编写绘制一群外星人的代码。