# 昨日知识点回顾
如何创建多行外星人
碰撞结束游戏
创建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.screenself.screen_rect = self.screen.get_rect()# 设置按钮的尺寸和其他属性self.width, self.height = 200, 50self.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.centerdef draw_button(self):# 绘制一个用颜色填充的按钮,再绘制文本self.screen.fill(self.button_color, self.rect)# screen.blit传递一幅图像以及与该图像相关联的rectself.screen.blit(self.msg_image, self.msg_image_rect)
14.1.2 在屏幕上绘制按钮
# 主程序
import sys
from time import sleepimport pygamefrom Settings import Settings
from game_stats import GameStats
from button import Button
from Ship import Ship
from alien import Alien
from bullet import Bulletclass 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减1self.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)