之后呢,接下来这个系统分析所做的工作呢就是要
做顺序图的工作,这个顺序图呢实际上又回到了我们 这个需求分析中的什么呢?use case。
只不过我们在当前 在那个需求分析阶段做 use case 的时候呢,实际上是一种
这个黑盒的描述,在详细描述 use case 的时候我们主要是
侧重在这个系统边界上,描述这个外部的参与者和系统之间的这个 在系统边界上这个交互。
而现在呢我们白盒的方式,用白盒的视角进一步来描述 这个
use case 的话,那时候 我们借助的工具就不同了,我们这时候要用这个顺序图来
把所有的这个需求分析走一遍,这样的话呢,一方面呢使我们知道
我们这个类图中的每个对象之间是如何协作的,另一方面也可以
使我们产生一些我们这个光靠静态的这种分析类图
没有想到的一些类,往往呢会在这个画顺序图的时候呢,我们会想到,有些时候呢
没有这个类可能这个功能就不完整,我们需要加上这么一个类,实际上 use
case、 顺序图、 类图,它们三者在系统分析的时候是一个相互促进相互衔接
的这么一种,相互促进,在建模的过程中一开始呢是一个非常
不太这个完整的一个图,但是通过建立建立三者 之后,然后呢,通过三者之间的这个
这个相互的一种这个检查,或者说相互之间的一种
验证,可以呢,使三者呢都会得到一个非常充分的一个 完善。
在当前的情况下我们又回到了use case,我们用这个顺序图来进行 对这个我们的这个
use case 用另外一种白盒视角进行建模,比如说我们现在是用顺序图进行开始游戏
跟 use case,跟那个需求分析的时候的这个描述这个 参,这个交互序列就变得完全不同了。
这时候开始游戏呢我们就变得非常 白盒,因为它我们不仅是个参与者和系统之间的
一种系统边界上的交互,而且呢还深入到我们系统的内部,涉及到一些系统内对象之间的一些 交互过程。
就是说开始游戏的时候游戏者先要战场发送一个消息
然后战场呢在接到这个消息之后呢,它要产生背景,产生很多精灵,然后同时运动
精灵,每个精灵都运动起来,然后呢这时候就可以 进行游戏。
这是我们这个用这个顺序图来描述 这个游戏者在运动自己的这个
主角战斗机的时候,或者说在发射子弹的时候的一些
场景,就比如说这个游戏者发射子弹,它实际上是这个向战斗机这个对象发送了一个消息
然后战斗机在接受到这个
接受到我这个消息之后呢,它会马上产生一个子弹对象,然后呢
同时呢为了便于这个战场对这个子弹进行控制
所以呢它要把这个子弹要向战场发送消息,让
战场呢把自己作为一个参数,加入到 我们这个战场上,这么,子弹把它加入到这个之后,把战场把这个
子弹加入进来之后呢,那就意味着战场以后呢可以对这个子弹进行控制
以后就交给子弹,把这个子弹的控制呢就交给战场来完成,而不是这个
战斗机来控制的子弹,战斗机一旦发送出去子弹之后呢就没法对它进行控制了
接下来呢这个子弹呢就可以进行,这个,进行各种各样的一些,这个
场景,这个比如说一个运动 这个轨迹,这样的话,就可以这个进一步的这个自己执行
这个场景呢描述的是我们这个 战场在评估,在每走一帧数据的时候
每进行一次交互,每进行一次这个
敌我双方的一些这个博弈之后呢,它要进行一个评估
评估的时候它自己向自己发送一个消息,比如说这个评估。
另外呢这个 评估的时候我要这个向这个战斗机发送
一个消息,问,对每一个战斗机都要发送一个消息 实际上这里我们这个如果用
UML2 顺序 图 2 的话,描述的更加精确,用一种组合交互片段
加上一些这个操作,组合操作 符和操作数,这样的话会也非常
严格的表示,这里我们用的是比较简单的一种表示方式。
碰到子弹,那就是说 如果就是向每个战斗机发送一个消息,问一下这个
当前这个子弹你碰到过没有,如果说你碰到的话我就要对你的生命值进行一个削尖,我就要
将你的生命值减掉我子弹的破坏量,不同子弹的破坏量是不一样的,所以呢我这
这时候呢要进行对你生命值进行削尖,就是说如果你碰撞子弹的话 然后如果你的生命值削减到
0 或者小于 0 的话,那你自己这个战斗机就会
被,从战场上被删除掉,你战斗机已经爆炸了 就是已经死了这个战斗机。
这个这时候呢 这个就战斗机呢,在这个过程中呢,它是实际上是
自己判断,如果我的生命值发生了一个变化,我就向战场,发送一个消息,让战场把我从
这个战场的登记本里边,把这个战斗机这个信息给删除掉,同时呢
这个战场在接到这个消息的时候呢,就会这个一方面它把记录删除,另一方面呢它要 真正把这个战斗机在画面中删除。
同时呢由于这个子弹碰到了战斗机 了所以子弹本身也应该被删除掉,是吧?这个同时呢
在删除掉子弹删除掉战斗机之后,要产生一个爆炸的这么一个对象,然后呢将爆炸
加入到战场上进行管理,这是一个非常,稍微复杂一点儿的一个 交互序列。
另外呢,还有一种这个评估呢,就是当两个
飞机相撞的时候,我们这个飞机和这个敌机直接同归于尽,这时候呢 直接这个就是不用撞几次了,一次
只要有一个,一点碰撞,然后二者呢全部同归于尽,这也是一个 业务的一个场景。
同理,也是这个检测 主角是不是跟所有的敌机发生了碰撞,如果发生的话呢我就
删除自己,同时删除敌机,同时呢也把这个二者产生的一些的子弹都给删了
这个并且呢,这时候要产生两次爆炸,那么这个自己发生一个爆炸,敌机也发生一个爆炸
两个爆炸同时加入到我们这个战斗机中,加入到我们战场上
另外这个场景呢就是描述了这个评估的时候我是否这个战斗机撞到给养,注意这个
撞到给养本身,我这个飞机,我游戏者自己操控的飞机可以撞到给养,敌机
也可以撞到给养,是吧?这个撞到什么样的给养,根据给养的类型 来确定它的这个生命值,在哪个生命值上加
如果你撞到生命值,对于这个这种给养那你就生命值加到一个固定数值
要撞到载弹量,载弹量加一,要撞到什么
这个其它的,比如说这个 一些这个子弹,那子弹也要加。
爆炸,就是爆炸本身这个一旦加入战场它就在战场出现
但这个爆炸不能老在这出现,它在持续了几秒中之后应该自动的消失,这个应该是
它在每进行评估的时候要对爆炸的生命值减一,这样当爆炸生命值减到 0 的时候 那就要把爆炸从战场上删除。
另外呢就是处理超界,因为这个子弹在飞出去之后呢,不应老
在那儿飞,这样的话内存啊,或者说这个对我们程序的这个效率造成一定的影响
所以当子弹啊,补给啊,没人撞了之后它应该是
飞出我们的这个系统战场所能够展示的这个世界之后,它应该被自动消除
这也是应该考虑到的一个问题,这里呢,就给出了一个在 游戏控制的时候,是吧,这个指挥我自己的
这个战斗机,进行这个游戏的时候的一个场景,也就是说我这个 这个有时候会发射子弹,那时候产生子弹,如果说是这个
这个战斗机啊,这个战场实际上控制起到一个非常核心的作用,这个战场呢要
进行这个运动,根据战斗机的一些状态,要决策一下这个战斗机
下一步要再怎么走,是往前走啊往后退啊往左往右,这些都由战场决策
然后呢这个,有时候产生子弹的时候,这时候呢战场应该将子弹加入进来
以及这个不仅是战斗机和子弹,同时呢它还要 运动一些各种各样的子弹,给养和背景
背景本身呢,也应该运动,这样的话就给人一种这个飞机啊,所有的飞机都是往前飞的感觉
而不是在这,这个原地在那儿这个来回的走,那不是飞机的一种状态,那一种人啊或者其它的- 一种游戏 的场景。
所以这是这个。
另外呢就是我们要 在最后,要判断一下什么呢?判断一下这个胜利,尽管胜利不是说这个
每一帧,都会出现这个胜利的结果,但是呢我们有必要 在判断完这个战况分析的时候我们要再判断是否胜利
如果胜利的时候我们要做一些特殊的处理,就是胜利呢比如说这个
所有的主角的这个生命值发生了一个,小于 0 了,那就
失败,如果我把所有,单位时间内把所有的这个敌机全部打掉然后我这个就是 这个自动胜利。
另外呢就是补充精灵,就是补充精灵,然后这个在单位时间内啊如果说是
这个战场上还有敌机,那就是这个我要向战场 呢发送一个信号,注意这时候我们这个消息啊
它是一个异步消息,这个我们在做顺序图的时候一个重要的一个知识点什么呢?就是要识别同- 步消息和异步消息
这是一个非常难点,因为我们在以前做的时候呢,大部分同学在这方面呢应该说
掌握的不够好,这是我们在顺序图时候,重点向大家介绍的一个问题
就是说这个时候呢,由于它是两个主动对象之间发送信号
当然主动对象和主动对象之间也可以发送同步消息,这里边有很多的一些策略,和
这个判断方式,在当前情况下是一种异步的信号,所以呢这个
当然我的精灵补充器向战场发送一个信号的时候呢,这个战场在接到这个异步信号的时候
它要产生一些新的战斗机,就是增加 一些难度,并且呢将这个战斗机加入到战场上,进行运作
这里呢是这个一些这个 补给,是吧,补给要不定期的出现,这时候要计算一个随机的一个
一个间隔,然后如果是间隔的到了之后呢
要随机的算一个,出现一个什么样的补给,到底是油箱,还是医疗,还是 这个子弹箱,等等。
这样的话产生之后把它加进来 进行控制。
这个场景呢是描述保存游戏这个 本身是很简单,就是这个游戏者一按保存,要求战场保存我的
所有的精灵,这时候战场上所有的精灵的状态给他保存起来,保存到一个文件中,这个恢复游戏
就是当我需要的时候需要重新玩,然后这个 从这个,不是从头开始,而是从我保存的这个状态下开始的时候
战场应该恢复,应该把这个游戏给产生出来,根据我这个
保存的文件中,产生,重新产生一些精灵,然后把它们属性设置到文件中 这个保存的这些属性,然后让它们动起来,然后就开始游戏玩
这个还有呢,我们这个,前边呢这些都是一些小的场景,我们可以
用这个活动图把这些场景统一的串联起来,就是说我们在
做程序执行的时候它是一个循环,然后这个循环包括 第一步呢就是运动控制,运动控制实际上就是
把那刚才我们在运动控制的那几个顺序图给它嵌套进来 评估,是吧,评估也是那几个评估,评估到底是评估
这个飞机啊,评估是否中弹,评估是否这个 同归于尽,评估是否撞到好事儿,等等,这些东西
另外呢就是判断,判断胜利判断失败,如果失败怎么办,胜利怎么办 整个用,可以用一个活动图,把这个
所有的这些小的交互片段给它串联成一个大的 交互片段,整个这个程序流程其实就是这样
当然呢,在UML2 的时候可以用一种这个交互概要图 来描述这个,这就宏观上更加清晰