HIHGame 0.1架构设计(Game)

Harmony.Game核心模块

上面是第一个版本Game部分的架构图。

Harmony.Game P1
Group RelationShip

RelatedGroupInfo

  为了提高查询效率,单位的分组使用的是枚举类型。相关组的信息里包含相关的两个组是否碰撞(bool),这两个组之间的关系(<>RelationShip),以及一个可以让用户添加的UserData。

HIHGroupManager

  管理单位组信息的类,单例类。相关组的信息用哈希表的数据结构,以两个相关组的枚举数值组合作为Key值,以组之间的信息(RelatedGroupInfo)为Value值来存储和查询的。这样做的原因是因为两个组之间相关信息的查询会是非常频繁的,尤其是两个组的单位之间是否存在碰撞关系,在Box2D每一帧的碰撞检测中都会被查询很多次。

ContactListener

  在Box2D中可以实现一个监听器接口类(IContactListener)来处理物体的碰撞。在对它的实现中用HIHGroupManager来判断两个物体是否应该碰撞。然后就可以让Box2D的World使用我们自己写的ContactListener做碰撞处理。

Harmony.Game P2
Unit

  Unit就是强化过的Body,对Body的常用功能进行封装。Box2D的原版API为了保证它的灵活性所以使用起来非常麻烦,而实际上对于我们的游戏并不需要它全部的自由度,所以对它做一定程度的封装和简化让后续的开发容易一些。Unit被定位为游戏底层中物理逻辑上的最小物体单位(所以叫“Unit”)。Unit对Body不使用继承关系是因为在游戏逻辑中无法直接调用Body的方法。Box2D是基于物理学中以千克米每秒为单位的数据,而我们的游戏逻辑里是基于图形上以像素为单位的数据,所以调用Box2D时数据都需要经过转换。

DrawUnit

  DrawUnit是带绘图功能并能把图形和物理数据绑定同步的单位。因为主要是偏向逻辑上的物体,所以直接继承自Unit;因为需要绘图,所以DrawUnit的组成里面包括一个Sprite;因为还需要通过更新来同步物理数据和图形,所以实现了IUpdatable接口。

Character

  以带有物理逻辑和绘图功能的DrawUnit为基础,再加上动画和动作就是最基本的游戏人物了。因为是针对横版游戏。所以该人物在物理逻辑上被固定为不会旋转倾斜的矩形,并且内置地面感应器以判断该人物是否站在地面上。

SensorInfo

  感应器是用于实时检测物体进入或离开感应区域的东西。为了比较容易地适应Box2D中对感应器的设计并保证效率,所以让感应器的存在只是个抽象的概念。而有实体的是记录传感器信息的类。一旦创建了感应器以后,只管通过这个类获取和设置传感器的信息就可以了。

Harmony.Game P3
UnitDef

DrawUnitDef

CharacterDef

  这三个包含定义数据的类用于创建所对应的对象。UnitDef对应Unit,DrawUnitDef对应DrawUnit,CharacterDef对应Character。正如Unit、DrawUnit和Character之间有继承关系一样,三个定义类之间也有同样的继承关系。其中人物的定义还包括了人物所带动画的定义数据(FrameDef)。这三个类只包含最基本的数据类型,以保证对象的创建数据容易被保存到外部文件或是从外部文件加载。为以后创建游戏的数据脚本做准备。

Harmony.Game P4
World

  World类是游戏的核心。一方面封装了Box2D的物理世界,并负责对物理世界进行更新;另一方World以工厂模式负责创建游戏中的各种各样的物体。因为允许有多个World(平行世界?)的存在,所以不把它定为单例类。World创建物体都是通过各种接口接受所创建物体对应的Def数据,然后返回物体实例的方式完成。

Harmony.Game P5
IAction

  人物动作的接口类,指明了一个人物的动作必须包括开始做(Do)、打断(Break)、更新等方法。还有动作的名称、优先级、动作开始和停止执行时触发的事件委托。名称是为后来AI脚本系统做准备;优先级是单位在同时接到多个动作指令时,用于选取应执行的指令,优先级数大于或等于当前正在执行动作的优先级时,会将当前动作打断(Break),然后执行优先级更高的动作;动作开始和执行停止而触发的事件委托也是给后来写AI系统或是增加动作效果而留下的接口。因为是针对横版游戏系统开发的游戏,所以底层中内置Walk、Jump、Stop、TurnLeft、TurnRight等基本动作的实现。

本文写于2011年3月24日

标题目录