游戏中存在各种各样的buffer状态给玩家增强属性或者消减属性 本人 大体设计buffer如下:
在state.h / state.cpp 真正buffer对象的文件
class CBuffer:public IStateInfo //所有的buffer都继承自 IStateInfo
{
public:
CBuffer{}
~CBuffer{}
public:
virtual OnAdd(CState*);//实施具体加buffer操作发消息给客户端显示buffer增加玩家属性等
virtual OnDel(CState*);//告诉客户端删除buffer 并恢复玩家属性
virtual OnLoad(CState*){};
virtual OnTrigger(CState*);//定时器 定时处理buffer状态
protected:
virtual bool OnLoadProperty( XCmlCfgLoader &){return true;} //额外配置需要
}
///
class IStateInfo
{
//此类主要是读取配置中buffer 的基本属性
virtual void OnAdd( CState* ){}
virtual bool OnTrigger( CState* ) = 0;
virtual void OnDel( CState* ){}
virtual void OnLoad( CState *pState )
{
OnAdd(pState);
OnTrigger(pState);
}
}
///
//可以当做接口类
class CState
{
//定义了一些与外界相关的数据 比如说技能属性指针 还有 本身的 buffer 属性指针等信息
void OnCreate() //重载
}
///
//buff管理类 静态的
class CStateMgrImpl
{
bool Init(); //初始化所有buff的信息填充IStateInfo指针并且存进map里面
CState* CreateState( string statename , IBiology *pBiologyHolder , IBiology *pCaster )
}
读配置:
IStateInfo *CStateMgrImpl::CreateStateFromXML()
{
stStateTable *pItem = std::lower_bound( StateTable , StateTable+_countof( StateTable) , iType)
IStateInfo *pStateInfo = pItem -> CreateObject();
pStateInfo->LoadProperty();
return pStateInfo; //构造出了buffer信息
}
里面配置的一个数据结构 看起来挺高端的
struct stStateTable
{
enStateType eType;
IStateInfo* (*CreateObject);
}
template<class State>
static IStateInfo* CreateStateObject(){ return new State() ; }
typedef enum enStateType
{
enStateAddHpm = 1, //buff Typeid
}
stStateTable StateTable[]=
{
enStateAddHpm, &CreateStateObject<CAddHPState>}, //枚举 -》 具体buffer类型
}