在之前的项目中我们已经添加了玩家的飞船,子弹,以及如何开火等功能,今天开始我们要更加完善这个游戏,有子弹当然要有敌人啦!开始之前我们先来回顾一下之前的进度。
2.1.1 回顾
开发较大的项目时,进入每个开发阶段前回顾一下开发计划,搞清楚接下来要通过编写代码来完成哪些任务都是不错的主意。本章涉及以下内容。
- 研究既有代码,确定实现新功能前是否要进行重构。
- 在屏幕左上角添加一个外星人,并指定合适的边距。
- 根据第一个外星人的边距和屏幕尺寸计算屏幕上可容纳多少个外星人。我们将编写一个循环来创建一系列外星人,这些外星人填满了屏幕的上半部分。
- 让外星人群向两边和下方移动,直到外星人被全部击落,有外星人撞到飞船,或有外星人抵达屏幕底端。如果整群外星人都被击落,我们将再创建一群外星人。如果有外星人撞到了飞船或抵达屏幕底端,我们将销毁飞船并再创建一群外星人。
- 限制玩家可用的飞船数量,配给的飞船用完后,游戏结束。
我们将在实现功能的同时完善这个计划,但就目前而言,该计划已足够详尽。
我们在开发的同时一直不断地重构,因此当前需要做的清理工作不多,但每次为测试新功能而运行这个游戏时,都必须使用鼠标来关闭它,这太讨厌了。下面来添加一个结束游戏的快捷键Q:
def check_events(ai_settings,screen,ship,bullets):
#响应案件和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#判断持续移动
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
elif event.key == pygame.K_q:
sys.exit()
2.1.2 创建Alien类
在创建类之前,你需要找一个代表外星人的图片,当然也可以用书中的图,找到之后,将图片放到images文件夹下。
import pygame
from pygame.sprite import Sprite
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/et.png')
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)
除位置不同外,这个类的大部分代码都与Ship 类相似。每个外星人最初都位于屏幕左上角附近,我们将每个外星人的左边距都设置为外星人的宽度,并将上边距设置为外星人的高度。
2.1.3 创建Alien实例
在主程序中,我们引入alien模块,然后创建一个实例。
import pygame
from pygame.sprite import Group
from setting import Settings
from ship import Ship
from alien import Alien
import game_functions as gf
def rungame():
#初始化游戏并创建一个屏幕对象
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()
#创建一个外星人
alien = Alien(ai_settings,screen)
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,alien,bullets)
rungame()
2.1.4 让外星人出现在屏幕上
为让外星人出现在屏幕上,我们在update_screen() 中调用其方法blitme() :
def update_screen(ai_settings,screen,ship,alien,bullets):
#每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
#在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 屏幕上绘制飞船#
ship.blitme()
# 屏幕上绘制敌人
alien.blitme()
#让最近绘制的屏幕可见#
pygame.display.flip()
完成以后,运行一下,看看效果。

网友评论