在这篇博客中,我将简单分析一下 game_stats.py、scoreboard.py 和 button.py 三个文件:
5. game_stats:
这是一个用于跟踪游戏各类统计信息的类,以下是其全部内容:
class GameStats():
'''用于跟踪游戏统计信息的类'''
def __init__(self, ai_settings):
"""初始化统计信息"""
self.ai_settings = ai_settings
self.reset_stats()
self.game_active = False # 游戏刚启动时处于活动状态
self.high_score = 0 #在任何情况下都不应重置最高得分
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
可以发现,在方法__init__()
中,初始化了那些在刚运行时固定的信息,如游戏刚启动时处于活动状态以及任何情况下都不应重置的最高得分。并调用了接下来定义的方法reset_stats()
。
在方法reset_stats()
中,初始化了在游戏运行期间可能变化的统计信息,如玩家剩余的飞船数和玩家的得分。
6. scoreboard:
这是一个显示玩家各类得分信息的类,以下是其全部内容:
import pygame.font
class Scoreboard():
"""显示得分信息的类"""
def __init__(self, ai_settings, screen, stats):
#初始化显示得分涉及的属性
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
# 显示得分信息时使用的字体设置
self.text_color = (35,35,35) #设置文本颜色
self.font = pygame.font.SysFont('arial',47) #实例化一个字体对象
self.prep_score() # 准备初始得分图像
self.prep_high_score() # 准备最高得分图像
def prep_score(self):
#将得分转换为一幅渲染的图像
score_str = str(self.stats.score) #将数字值stats.score 转换为字符串
self.score_image = self.font.render(score_str, True, self.text_color,
self.ai_settings.bg_color) #将这个字符串传递给创建图像的render()
# 将得分放在屏幕右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20 #让其右边缘与屏幕右边缘相距20像素
self.score_rect.top = 20 #让其上边缘与屏幕上边缘也相距20像素
def show_score(self):
self.screen.blit(self.score_image, self.score_rect)#在屏幕上显示当前得分
self.screen.blit(self.high_score_image, self.high_score_rect)#在屏幕上显示最高得分
def prep_high_score(self):
high_score = int(self.stats.high_score)
high_score_str = "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)
#将最高得分放在屏幕顶部中央
self.high_score_rect = self.high_score_image.get_rect()
self.high_score_rect.centerx = self.screen_rect.centerx
self.high_score_rect.top = self.score_rect.top
可以看到,方法__init__
主要用于初始化得分并设置其相关属性,其做了以下几件事情:
- 初始化显示得分涉及的属性(第8-12行)。
- 设置了具体的文本颜色并实例化了一个字体对象(第15-16行)。
- 准备初始得分图像和最高得分图像。(第17-18行)。
接着,方法prep_score()
(第20-29行)得分转换为字符串,然后将这个字符串传递给创建图像的render()
以将得分转换为一幅渲染的图像。最后,将玩家的得分放置在屏幕右上角。
同理,方法prep_high_score()
(第36-44行)将玩家的最高得分转换为一幅渲染的图像并放在屏幕顶部中央。
第31-34行中,方法show_score()
让我们能够在屏幕上显示玩家的当前得分与历史最高得分。
7. button:
这是一个用于设置游戏的 “Play”按钮的类,以下是其全部内容:
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 = (0,255,0) #让按钮的rect对象为亮绿色
self.text_color = (255,255,255) #让文本为白色
self.font = pygame.font.SysFont('arial', 48) #使用什么样字体,而48指定了文本的字号
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
self.prep_msg(msg)
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
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
与上面的scoreboard()
相似,在__init__()
(第5-19行)中,初始化了按钮的属性,并设置了按钮的相关属性,如尺寸,颜色,字体,字号和位置。还在第21行调用了prep_msg()
。
方法prep_msg()
(第23-29行)则将文本渲染为图像,并使其在按钮上居中。
最后,利用draw_button()
(第31-35行)绘制一个用颜色填充的按钮,再绘制文本。