HIHGame 0.1架构设计(Core)

Harmony.Core
  初步实践以后,第一个版本Core部分的设计图。

IUpdatable

Drawable

  游戏的核心总是围绕着做两件事,更新(Update)和绘制(Draw或者叫做Render)。所以游戏里的东西要么需要更新,要么需要绘制,或是同时需要更新和绘制。因为C#里不能使用多继承,所以我们把东西相对比较少的需要更新的特性抽象为接口IUpdatable,把有从属关系的需要绘制的部件定了一个基类叫Drawable。

Component

DrawComponent

  在我们的设计中,一个对象被得到更新的实质就是把这个对象放入一个更新队列中,这个队列会在游戏每帧被遍历一遍并逐个对象调用Update()函数。如果这个对象要取消更新,只用把它从更新队列中移除就可以。这些逻辑应该是在实现IUpdate接口的类中实现的,为了不用反复实现这个接口并具有被更新的能力,我们增加了实现了更新功能并留有Update()函数接口的Component类。同理,DrawComponent在Component的基础上继承了Drawable类而同时具有绘制和更新的特性。

UpdateController

  UpdateController的作用是管理游戏的更新队列。在游戏中可能有时候要将需要更新的物体分组,比如有一个时间停止的技能,释放后10秒内和敌人相关的任何东西,包括敌人的技能效果都被停止而玩家一切不受影响。这样也许就需要有两个更新队列,敌人相关的一切使用敌人的更新队列管理,玩家相关的东西使用玩家的更新队列,这样在时间停止技能释放以后,只要简单的让敌人的更新队列暂停更新,技能结束又继续更新就可以了。

Scene

  游戏可能会需要很多场景,每一个场景会需要在切换进入时进行初始化,在切换离开时销毁,从而让游戏减少对资源的占用。每个场景都有自己绘制的根节点(Root),自己的更新队列(Controller),让和场景相关的物体使用。场景可以用来切换游戏到不同的状态,比如游戏模式到菜单界面,或是用来管理不同的关卡。

HIHSceneManager

  负责场景的管理,使游戏里同时只能有一个场景被使用。管理器一个就够用了,所以它是一个单例类。(注:所有以HIH开头的类都是单例类)

IEffect

  每个Sprite在绘制前都必须应用叫Effect的东西,每个Sprite使用的不同纹理缩放值旋转角度等等,都是通过更改Effect的属性来使绘制结果不同的。一方面Sprite自身的特点要通过设置Effect来体现,另一方面比如我们要应用不同的光照效果或是其它特效,这就得让Sprite更换应用不同的Effect才行。于是我们设计这个IEffect的接口类,上面有Sprite需要的设置属性用的所有接口,然后我们不同的Effect只要实现了这个接口就能给不同的Sprite更换使用。

HIHEffectManager

  当用户的窗口模式和大小改变,或是摄像机镜头有变化等等的情况时,要更新所有使用的Effect的一些属性,比如View和Projection。于是这个单例的管理类就用来负责搞定这件事。

Sprite

RepeatSprite

  Sprite还是保持是最小的绘图单元这样的存在意义。包括各种基本的图形操作的基础上,现在增加了R、G、B用来改变图片色调的属性,但是这个属性能起的作用与实现IEffect中Color接口的Effect是相关的。根据我们自己游戏的需要,设定一个完全支持该功能的Effect应该达到的效果是,在IEffect的Color设置为(0.0f, 0.0f, 0.0f)时图片全黑,(1.0f,1.0f,1.0f)时图片为正常色调,(2.0f,2.0f,2.0f)时图片全白。因为内置的BasicEffect的功能限制,实现的DefaultEffect只支持Color从(0.0f, 0.0f, 0.0f)到(1.0f,1.0f,1.0f)。Sprite内部为支持可能加入的光照效果使用了带法线数据的顶点并且用了大于4个顶点,让Sprite有正反两个面。

  在Reach模式下,如果要让纹理重复绘制需要纹理图片大小是2的N次方并且设置SamplerState的TextureAddressMode为Wrap。考虑到一个需要重复绘制图片的Sprite一般不会使用得太多,出于效率考虑就不把这项功能整合到Sprite中,而是扩展Sprite由RepeatSprite实现。

SpriteDef

  Sprite的数据定义类,为后面的数据脚本使用。

本文写于2011年3月24日

标题目录