记分
目标:添加一个Play按钮,让玩家能够开始游戏,以及游戏结束后再玩。每当玩家消灭一群外星人后,加快游戏的节奏,并添加一个记分系统,让游戏更有挑战性和趣味性。
1、添加Play按钮
Play按钮:它在游戏开始前出现,并在游戏结束后再次出现,让玩家能够开始新游戏。
让游戏一开始处于非活动状态,并提示玩家单击Play按钮来开始游戏。在game_stats.py中输入如下代码:
class GameStats():
# 跟踪游戏的统计信息
def __init__(self, ai_settings):
# 初始化统计信息
self.ai_settings = ai_settings
self.reset_status()
# 游戏刚启动时处于非活动状态
self.game_active = False
def reset_status(self):
# skip
现在游戏一开始将处于非活动状态,等我们创建Play按钮后,玩家才能开始游戏。
【1】创建Button类
由于Pygame没有内置创建按钮的方法,创建一个Button 类,用于创建带标签的实心矩形。下面是Button 类的第一部分, 请将这个类保存为文件button.py:
import pygame.font # 将文本渲染到屏幕上
class Button():
def __init__(self, ai_settings, screen, msg):
# 初始化按钮的属性
self.screen =screen
self.screen_rect = screen.get_rect()
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (67, 205, 128)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48) # 实参None 让Pygame 使用默认字体,48指定文本的字号。
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
# 按钮的标签只需创建一次
self.prep_msg(msg)
Pygame通过将你要显示的字符串渲染为图像来处理文本。在❺处,我们调用prep_msg() 来处理这样的渲染。 prep_msg() 的代码如下:
button.py
def prep_msg(self, msg):
# 将msg渲染为图像,并使其在按钮上居中
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
方法prep_msg() 接受实参self 以及要渲染为图像的文本(msg )。调用font.render() 将存储在msg 中的文本转换为图像,然后将该图像存储在msg_image 中。方法font.render() 还接受一个布尔实参,该实参指定开启还是关闭反锯齿功能(反锯齿让文本的边缘更平滑)。余下的两个实参分别是文本颜色和背景色。我们启用 了反锯齿功能,并将文本的背景色设置为按钮的颜色(如果没有指定背景色,Pygame将以透明背景的方式渲染文本)。
创建方法draw_button() ,通过调用它可将这个按钮显示到屏幕上:
button.py
def draw_button(self):
# 描绘一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
调用screen.fill() 来绘制表示按钮的矩形,再调用screen.blit() ,并向它传递一幅图像以及与该图像相关联的rect 对象,从而在屏幕上绘制文本图像。
【2】在屏幕上绘制按钮
alien_invasion.py
#skip
from button import Button
def run_game():
# skip
pygame.display.set_caption("Alien Invasion")
# 创建Play按钮
play_button = Button(ai_settings,screen,"Play")
# skip
# 开始游戏的主循环
while True:
# skip
gf.update_screen(ai_settings, screen,stats, ship, aliens, bullets, play_button)
run_game()
修改update_screen() ,以便在游戏处于非活动状态时显示Play按钮:
game_function.py
def update_screen(ai_settings, screen,stats, ship, aliens, bullets, play_button):
# skip
# 如果游戏处于非活动状态,绘制Play按钮
if not stats.game_active:
play_button.draw_button()
# 不断更新屏幕,让最近绘制的屏幕可见
pygame.display.flip()
运行游戏:
【3】开始游戏
需在game_functions.py中添加如下代码,以监视与这个按钮相关的鼠标事件: