# 昨日知识点回顾
如何创建多行外星人
碰撞结束游戏
创建game_stats.py跟踪统计信息
# 今日知识点学习
第14章 记分
14.1 添加Play按钮
14.1.1 创建Button类
import pygame.font
# button.py
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.center = self.screen_rect.center
# 按钮的标签只需创建一次
self._prep_msg(msg)
def _prep_msg(self, msg):
"""将msg渲染为图像,并使其在按钮上居中"""
# 方法font.render()接受一个布尔实参,该实参制定开启还是关闭反锯齿功能(反锯齿让文本的边缘更平滑)
# 后面两个实参分别是文本颜色和背景色(如果没有指定背景色,pygame渲染文本时将使用透明背景)
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)
# screen.blit传递一幅图像以及与该图像相关联的rect
self.screen.blit(self.msg_image, self.msg_image_rect)
14.1.2 在屏幕上绘制按钮
# 主程序
import sys
from time import sleep
import pygame
from Settings import Settings
from game_stats import GameStats
from button import Button
from Ship import Ship
from alien import Alien
from bullet import Bullet
class AlienInvasion:
"""管理游戏资源和行为的类"""
def __init__(self):
"""初始化游戏并创建游戏资源"""
pygame.init()
self.settings = Settings()
# 非全屏运行
self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
# 全屏运行
# self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
# self.settings.screen_width = self.screen.get_rect().width
# self.settings.screen_height = self.screen.get_rect().height
# 设置当前窗口标题
pygame.display.set_caption("Alien Invasion")
# 创建一个用于存储游戏统计信息的实例
self.stats = GameStats(self)
self.ship = Ship(self)
# 创建子弹精灵组
self.bullets = pygame.sprite.Group()
# 创建外星人精灵组
self.aliens = pygame.sprite.Group()
self._create_fleet()
# 创建Play按钮
self.play_button = Button(self, "Play")
-----snip-----
def _update_screen(self):
"""更新屏幕上的图像,并切换到新屏幕。"""
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.aliens.draw(self.screen)
# 如果游戏处于非活动状态,就绘制Play按钮
if not self.stats.game_active:
self.play_button.draw_button()
# 让最近绘制的屏幕可见
pygame.display.flip()
-----snip-----
运行结果:(Play按钮出现)
14.1.3 开始游戏
# 主程序
----snip----
def _check_events(self):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
elif event.type == pygame.MOUSEBUTTONDOWN:
# 玩家鼠标点击Play按钮做出响应
# pygame.mouse.get_pos()返回玩家单击时鼠标(x,y)元组
mouse_pos = pygame.mouse.get_pos()
self._check_play_button(mouse_pos)
def _check_play_button(self, mouse_pos):
"""在玩家单击Play按钮时开始新游戏"""
if self.play_button.rect.collidepoint(mouse_pos):
self.stats.game_active = True
----snip----
14.1.4 重置游戏
# 主程序
def _check_play_button(self, mouse_pos):
"""在玩家单击Play按钮时开始新游戏"""
if self.play_button.rect.collidepoint(mouse_pos):
# 重置游戏统计信息
self.stats.reset_stats()
self.stats.game_active = True
# 清空余下的外星人和子弹
self.aliens.empty()
self.bullets.empty()
# 创建一群新的外星人并让飞船居中
self._create_fleet()
self.ship.center_ship()
14.1.5 将Play按钮切换到非活动状态
# 主程序
def _check_play_button(self, mouse_pos):
"""在玩家单击Play按钮时开始新游戏"""
# game_active为False时游戏才开始并显示Play按钮
button_clicked = self.play_button.rect.collidepoint(mouse_pos)
if button_clicked and not self.stats.game_active:
# 重置游戏统计信息
self.stats.reset_stats()
self.stats.game_active = True
# 清空余下的外星人和子弹
self.aliens.empty()
self.bullets.empty()
# 创建一群新的外星人并让飞船居中
self._create_fleet()
self.ship.center_ship()
14.1.6 隐藏鼠标光标
# 主程序
def _check_play_button(self, mouse_pos):
"""在玩家单击Play按钮时开始新游戏"""
# game_active为False时游戏才开始并显示Play按钮
button_clicked = self.play_button.rect.collidepoint(mouse_pos)
if button_clicked and not self.stats.game_active:
# 重置游戏统计信息
self.stats.reset_stats()
self.stats.game_active = True
# 清空余下的外星人和子弹
self.aliens.empty()
self.bullets.empty()
# 创建一群新的外星人并让飞船居中
self._create_fleet()
self.ship.center_ship()
# 隐藏鼠标光标
pygame.mouse.set_visible(False)
def _ship_hit(self):
"""响应飞船被外星人撞到"""
if self.stats.ships_left > 0:
# 将Ship_left减1
self.stats.ships_left -= 1
# 清空余下的外星人和子弹
self.aliens.empty()
self.bullets.empty()
# 创建一批新的外星人,并将飞船放到屏幕底部的中央
self._create_fleet()
self.ship.center_ship()
# 暂停
sleep(0.5)
else:
self.stats.game_active = False
# 游戏结束,重新显示光标
pygame.mouse.set_visible(True)