3.2 项目规划
了解了游戏的效果以及功能后,现在分析它的设计思路和整体规划。
1. 状态模型
由于将要实现的《飞机大战》游戏有四个不同的界面,那么如何在同一个窗口且只有一个Display Surface的情况下实现这四个不同的界面呢?
这里使用状态模型。把不同的界面用不同的状态表示,每种状态下所做的事情和向屏幕绘制的内容是不同的。这里涉及的状态有WELCOME、RUN、GAMEOVER、PAUSE,它们分别对应于开始界面、游戏界面、结束界面和暂停界面。
不同状态下所做的事情分别如下。
WELCOME:
·绘制背景图、飞机大战Logo、Start按钮;
·响应处理Start按钮。
RUN:
·绘制背景图、我方飞机、子弹、敌方飞机、Pause/Resume按钮、分数;
·移动背景图、我方飞机、子弹、敌方飞机;
·碰撞检测;
·响应处理Pause/Resume按钮。
GAMEOVER:
·绘制背景图、提示方框、分数、Restart按钮、Exit按钮;
·响应处理Restart/Exit按钮。
PAUSE:
·绘制背景图、我方飞机、子弹、敌方飞机、Pause/Resume按钮、分数;
·响应处理Pause/Resume按钮。
其中,各个状态之间的转换关系如图3-5所示。
图3-5 状态模型之间的转换关系
游戏开始执行时,首先进入的是WELCOME状态。在WELCOME状态下,单击Start按钮进入RUN状态。在RUN状态下,单击Pause/Resume按钮进入PAUSE状态,我方飞机碰撞到敌方飞机则进入GAMEOVER状态。在GAMEOVER状态下,单击Restart按钮进入RUN状态。在PAUSE状态下,单击Pause/Resume按钮进入RUN状态。
该状态模型将在本程序中起到主线的作用,编写代码时,几乎在做任何事情之前都要确认当前所处的状态。
2. 目录结构
除了上面提到的状态模型,该程序的整体结构并不复杂,都只是对前面所介绍的Pygame理论知识的运用。
本章我们所要实现的飞机大战游戏的目录结构如图3-6所示。
图3-6的左侧为工程目录结构,右侧为各个py文件所包含的类。
在工程目录中,res目录存储的是资源相关的文件,包含字体、图片以及音频文件;source目录包含所有py源文件。下面介绍其中每个py文件的用途及其所包含的类。
·background.py:定义了背景类Background。
图3-6 《飞机大战》工程目录结构
·bullet.py:定义了子弹类Bullet。
·button.py:定义了按钮类Button。
·enemy.py:定义了敌机相关的类Enemy、EnemySmall、EnemyMiddle、EnemyBig;其中,Enemy类是其他三个类的基类。
·game.py:定义了游戏类Game,它是对游戏显示和控制起主要作用的类。
·hero.py:定义了我方飞机类Hero。
·image.py:定义了Image类,用来集中加载游戏所用到的全部图片。
·sound.py:定义了声音类Sound,用来控制音乐与音效的播放。
·stats.py:定义了Stats类,用来记录游戏状态。
·widgets.py:定义了游戏界面上用到的一些小部件类,其中Logo类用来显示“飞机大战”Logo,EndPrompt类用来显示结束界面上的提示方框,Scoreboard类用来显示记分牌,PauseResume类用来显示和控制暂停/恢复按钮。
·plane_wars.py:定义了整个程序的入口。
接下来就让我们按照这里给出的设计思路,从零开始一步步地实现《飞机大战》游戏。