游戏设计模式 之 Buff系统

design.gif

引擎:CocoCreator2.1.0
语言:TypeScript
Git仓库地址:https://github.com/superXfx/GameDesignPatterns.git
定义——
为“宿主”带来增益(Buff)或损害(Debuff),效果多是持续的并可被叠加。

类图——


Buff.jpg

从类图可以发现,BuffBase包含所有属性,具体buff只需要继承它为需要的几个属性赋值,重写Action()函数即可。
BuffMgr是管理者,注意它不是单例。因为每个Hero都会有独立的Buff系统,100个Hero就有100个Buff系统实例。
BuffFactory的作用是将BuffMgr和具体Buff类解耦。

接下来看代码
1、基类BuffBase


image.png

通过上面几个属性,控制buff的 持续时长,是否多次触发,是否允许叠加等特性。
在子类中为其赋值即可。


image.png

几个关键的函数,创建时调用Action();失效时调用Exit();
至于getAttr()比较有趣,它返回其影响的属性值的增(减)量,假设此buff效果是速度+10%,那么函数体中写
switch(attrType)

{
case Const_All.eAttrType.eSpeed:
return hero.speed * 0.1;
break;
};
2、具体Buff
<1>BuffSpeedUp


image.png

通过mLiveTime和mMaxCount很简单的设置了buff的持续时间和叠加层数
因为它是数值类buff,所以实现getAttr()并返回值。
<2>BuffChangeHero
image.png

这是个“效果类”buff——改变hero外形。
注意它通过实现mGroup,mClashGroup实现了同时只能有一个变形buff的目的——与任何“变形”buff互斥。
然后它实现Action(),Exit()控制“变形”即可。
3、BuffMgr
image.png

驱动buff系统,无甚可讲。
image.png

createBuff中可以看到一些实现细节——层级叠加 和 移除冲突buff。

——与hero结合——
1、因为可能会有多个hero,多个敌人。他们都可能有自己的一套buff挂在身上。
所以BuffMgr不能是单例,它应该是每一个hero/敌人 挂一个BuffHero实例。
如图


image.png

2、当外部调用Hero的属性时,应该检索buff,算上收益/损失值。
如图


image.png

综上,Buff系统全部讲完,具体到单个buff的实现,代码是很少的——在啰嗦一遍就是 对扩展开放,对修改关闭。

题外话——
在读《HeadFirst设计模式》,《整洁代码之道》,以及做项目的时候。
经常有种“好的编码原则 生长出 好的设计模式”的体会。
例如单一职权,开闭原则等等,如果踏实的践行,在回头看时,会发现可能已应用几个经典的设计模式。
我建议读一读上面两本书,它们是编写优雅代码路途中的灯塔。

下一篇,游戏设计模式 之 AI_行为树
https://www.jianshu.com/p/9a8ebf1f9419

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。