前言
本篇文章接着之前的内容,继续对游戏功能进行优化,主要是优化游戏状态以及对应的处理。
状态
一个游戏包含多种状态,这个状态是一个可以很复杂也可以很简单的内容。条件所限,我们这个游戏的状态就比较简单:
- 未开始
- 游戏中
- 暂停
- 结束
我们通过一个字段进行控制,并且将这个字段放置到setting
模块中。
class Setting:
"""系统设置类"""
def __init__(self):
-- snip --
# 游戏状态:0未开始,1游戏中,2暂停,3结束
self.game_status = 0
处理状态
根据不同的状态值,我们先对main
模块进行简单的处理。
import pygame
from pygame.sprite import Group
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Ship
def run_game():
"""启动游戏"""
# 初始化pygame
pygame.init()
# 定义一个系统设置对象
setting = Setting()
# 新建窗口
screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
# 窗口命名
pygame.display.set_caption(setting.caption)
# 定义一个飞船对象
ship = Ship(setting, screen)
# 创建子弹编组
bullets = Group()
# 创建外星人编组
aliens = Group()
# 创建编组内的外星人
gf.create_fleet(setting, screen, aliens)
while True:
if setting.game_status == 0:
pass
elif setting.game_status == 1:
# 处理监听事件
gf.check_event(ship, setting, screen, bullets)
# 移动飞船
ship.move()
# 更新子弹位置
gf.update_bullets(bullets, aliens, setting, screen)
# 更新外星人
gf.update_aliens(aliens, setting, ship)
# 刷新屏幕
gf.update_screen(setting, screen, ship, bullets, aliens)
elif setting.game_status == 2:
pass
elif setting.game_status == 3:
pass
if __name__ == '__main__':
run_game()
状态对应的业务
现在,我们要对状态思考响应的游戏业务。
这里直接描述一下我个人简单预定的功能:
- 启动游戏,弹出窗口,显示欢迎来到游戏,按回车键开始游戏。其他所有按键不生效。
- 在游戏中,按下回车暂停游戏;暂停游戏时按下回车继续游戏
- 开始游戏后,任意时刻按下
Esc
键退出游戏,回到黑色窗口,显示游戏介绍,暂停一秒关闭游戏。
代码实现
我们在第二步已经简单的对状态值进行了处理,接下来就根据上面的业务在对应的状态处理部分一一填充。
首先我们处理开始游戏的状态。
开始游戏
首先我们需要在setting.game_status == 0
的条件下新建一个not_start()
函数,传入参数setting
和screen
。这两个参数一个是要回写状态值到配置模块中,一个是渲染游戏窗口需要的一些属性。
修改main
模块中循环处理的部分如下:
-- snip --
while True:
# 没啥用,方便编写代码的时候看看代码执行情况