14.1添加Play按钮
游戏开始出现,游戏结束再次出现,让玩家能够开始新游戏,接下来修改游戏活动状态,让游戏一开始处于非活动状态,并提示玩家单机Play按钮来开始游戏。
game_stats.py
def __init__(self,ai_settings):
self.ai_settings=ai_settings
self.reset_stats()
#修改游戏标志为False,等创建Play按钮时玩家才能开始游戏。
14.1.1创建Button类
由于Pygame没有内置创建按钮的方法,我们创建一个Button类,用于创建带标签的实心矩形。
1.创建rect对象
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=(0,255,0)
self.text_color=(255,255,255)
self.font=pygame.font.SysFont(None,48)
#创建按钮的rect对象,并使其居中。
'''
创建一个表示按钮的rect对象
设置rect对象的center属性为屏幕的center属性
'''
#按钮的标签只需要创建一次
self.prep_msg(msg)
2.为rect矩形添加标签
调用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)
#让文本图像在按钮上居中:
'''
根据文本图像创建一个rect
将其center属性设置为按钮的center属性。
'''
3.创建draw_button()方法
draw_button()包括绘制矩形和绘制文本。
button.py
def draw_button(self):
'''
绘制一个用颜色填充的按钮
再绘制文本图像
'''
14.1.2在屏幕上绘制按钮
1.创建play_button实例
使用Button类来创建一个Play按钮。鉴于只需要一个Play按钮,我们直接在alien_invasion.py中创建它
2.显示按钮
将play_button传递给update_screen(),以便能够在屏幕更新时显示按钮,修改update_screen(),以便在游戏处于非活动状态时显示Play按钮。
14.1.3开始游戏
为在玩家单击Play按钮时开始新游戏,需在game_functions.py中添加代码,以监视与这
个按钮相关的鼠标事件:
1.game_functions.py
代码分析:
1.侦测玩家是否点击鼠标
2.获取玩家点击位置
3.判断玩家点击位置是否在Play按钮内
4.修改活动状态
game_function.py
#判断事件类型event.type是鼠标点击事件?
elif event.type==pygame.MOUSEBUTTONDOWN:
#mouse.get_pos()获取鼠标点击位置的x,y坐标
mouse_x,mouse_y=pygame.mouse.get_pos()
#侦测是鼠标是否在按钮内
check_play_button(ai_settings,screen,stats,play_button,ship,aliens,
bullets,mouse_x,mouse_y)
def check_play_button(stats, play_button, mouse_x, mouse_y):
"""在玩家单击Play按钮时开始新游戏"""
if play_button.rect.collidepoint(mouse_x, mouse_y):
stats.game_active = True
2.alien_invasion.py
修改check_events()
14.1.4重置游戏
为在玩家每次单击Play按钮时都重置游戏,需要重置统计信息、删除现有的外星人和子弹、创建一群新的外星人,并让飞船居中。
game_functions.py
def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
bullets, mouse_x, mouse_y):
"""在玩家单击Play按钮时开始新游戏"""
if play_button.rect.collidepoint(mouse_x, mouse_y):
# 重置游戏统计信息
stats.reset_stats()
stats.game_active = True
# 清空外星人列表和子弹列表
aliens.empty()
bullets.empty()
# 创建一群新的外星人,并让飞船居中
creat_fleet(ai_settings,screen,ship,aliens)
ship.center_ship()
alien_invasion.py
修改check_events()
14.1.5将Play按钮切换到非活动状态
让游戏仅在game_active为False时才开始:
修改game_function.py
14.1.6隐藏光标
为让玩家能够开始游戏,我们要让光标可见,但游戏开始后,光标只会添乱。为修复这种问
题,我们在游戏处于活动状态时让光标不可见:
隐藏光标
pygame.mouse.set_visible(False)
显示光标
pygame.mouse.set_visible(True)