引擎:CocoCreator2.1.0
语言:TypeScript
Git仓库地址:https://github.com/superXfx/GameDesignPatterns.git
定义——
为“宿主”带来增益(Buff)或损害(Debuff),效果多是持续的并可被叠加。
类图——
从类图可以发现,BuffBase包含所有属性,具体buff只需要继承它为需要的几个属性赋值,重写Action()函数即可。
BuffMgr是管理者,注意它不是单例。因为每个Hero都会有独立的Buff系统,100个Hero就有100个Buff系统实例。
BuffFactory的作用是将BuffMgr和具体Buff类解耦。
接下来看代码
1、基类BuffBase
通过上面几个属性,控制buff的 持续时长,是否多次触发,是否允许叠加等特性。
在子类中为其赋值即可。
几个关键的函数,创建时调用Action();失效时调用Exit();
至于getAttr()比较有趣,它返回其影响的属性值的增(减)量,假设此buff效果是速度+10%,那么函数体中写
switch(attrType)
{
case Const_All.eAttrType.eSpeed:
return hero.speed * 0.1;
break;
};
2、具体Buff
<1>BuffSpeedUp
通过mLiveTime和mMaxCount很简单的设置了buff的持续时间和叠加层数
因为它是数值类buff,所以实现getAttr()并返回值。
<2>BuffChangeHero
这是个“效果类”buff——改变hero外形。
注意它通过实现mGroup,mClashGroup实现了同时只能有一个变形buff的目的——与任何“变形”buff互斥。
然后它实现Action(),Exit()控制“变形”即可。
3、BuffMgr
驱动buff系统,无甚可讲。
createBuff中可以看到一些实现细节——层级叠加 和 移除冲突buff。
——与hero结合——
1、因为可能会有多个hero,多个敌人。他们都可能有自己的一套buff挂在身上。
所以BuffMgr不能是单例,它应该是每一个hero/敌人 挂一个BuffHero实例。
如图
2、当外部调用Hero的属性时,应该检索buff,算上收益/损失值。
如图
综上,Buff系统全部讲完,具体到单个buff的实现,代码是很少的——在啰嗦一遍就是 对扩展开放,对修改关闭。
题外话——
在读《HeadFirst设计模式》,《整洁代码之道》,以及做项目的时候。
经常有种“好的编码原则 生长出 好的设计模式”的体会。
例如单一职权,开闭原则等等,如果踏实的践行,在回头看时,会发现可能已应用几个经典的设计模式。
我建议读一读上面两本书,它们是编写优雅代码路途中的灯塔。
下一篇,游戏设计模式 之 AI_行为树
https://www.jianshu.com/p/9a8ebf1f9419