13.7 确定应运行游戏的哪些部分
我们需要确定游戏的哪些部分在任何情况下都应运行,哪些部分仅在游戏处于活动
状态时才运行:
alien_invasion.py
def run_game(self):
"""开始游戏主循环。"""
while True:
self._check_events()
if self.stats.game_active:
self.ship.update()
self._update_bullets()
self._update_aliens()
self._update_screen()
在主循环中,在任何情况下都需要调用_check_events() ,即便游戏处于非活动
状态。例如,我们需要知道玩家是否按了Q 键以退出游戏,或者是否单击了关闭窗
口的按钮。我们还需要不断更新屏幕,以便在等待玩家是否选择开始新游戏时修改
屏幕。其他的函数仅在游戏处于活动状态时才需要调用,因为游戏处于非活动状态
时,不用更新游戏元素的位置。
现在运行这个游戏,它将在飞船用完后停止不动。
动手试一试
练习13-6:游戏结束 在为完成练习13-5而编写的游戏中,记录飞船被撞到了
多少次以及有多少外星人被射杀。确定合适的游戏结束条件,并在满足该条件
后结束游戏。
13.8 小结
在本章中,你学习了:如何在游戏中添加大量相同的元素,如创建一群外星人;如
何使用嵌套循环来创建元素网格,还通过调用每个元素的方法update() 移动了大
量元素;如何控制对象在屏幕上移动的方向,以及如何响应事件,如有外星人到达
屏幕边缘;如何检测和响应子弹和外星人碰撞以及外星人和飞船碰撞;如何在游戏
中跟踪统计信息,以及如何使用标志game_active 来判断游戏是否结束。
在与这个项目相关的最后一章中,我们将添加一个Play按钮,让玩家能够开始游
戏,以及在游戏结束后重玩。每当玩家消灭一群外星人后,我们都将加快游戏的节
奏,并添加一个记分系统,得到一个极具可玩性的游戏!
第 14 章 记分
本章将结束游戏《外星人入侵》的开发。我们会添加一个Play
按钮,用于根据需要启动游戏以及在游戏结束后重启游戏,还会修改这个游
戏,使其随玩家等级提高而加快节奏,并实现一个记分系统。阅读本章后,你
将掌握足够多的知识,能够开始编写随玩家等级提高而加大难度以及显示得分
的游戏。
14.1 添加Play按钮
本节将添加一个Play按钮,它在游戏开始前出现,并在游戏结束后再次出现,让玩
家能够开始新游戏。
当前,这个游戏在玩家运行alien_invasion.py时就开始了。下面让游戏一开始处于
非活动状态,并提示玩家单击Play按钮来开始游戏。为此,像下面这样修改
GameStats 类的方法__init__() :
game_stats.py
def __init__(self, ai_game):
"""初始化统计信息。"""
self.settings = ai_game.settings
self.reset_stats()
# 让游戏一开始处于非活动状态。
self.game_active = False
现在,游戏一开始将处于非活动状态,待创建Play按钮后,玩家才能开始游戏。
14.1.1 创建Button 类
由于Pygame没有内置创建按钮的方法,我们将编写一个Button 类,用于创建带标
签的实心矩形。你可在游戏中使用这些代码来创建任何按钮。下面是Button 类的
第一部分,请将这个类保存为文件button.py:
button.py
import pygame.font
class Button:
❶ | def __init__(self, ai_game, msg): """初始化按钮的属性。""" |
self.screen = ai_game.screen
self.screen_rect = self.screen.get_rect()
# 设置按钮的尺寸和其他属性。
❷ self.width, self.height = 200, 50
self.button_color = (0, 255, 0)
self.text_color = (255, 255, 255)
❸ self.font = pygame.font.SysFont(None, 48)
# 创建按钮的rect对象,并使其居中。
❹ | self.rect = pygame.Rect(0, 0, self.width, self.height) self.rect.cent |