【步兵 c++】组件模式–基础篇 by EOS.
最近比较忙,所以就偷懒了一个星期,现在又有大把的时间写博客了,不要问我为什么,
这是一个悲伤的故事,前段时间的忙变得毫无意义了。
由于好久没用c++了,感觉再不用用就要忘球了,所以决定用c++来写。
为什么用组件
最近发现组件模式的魅力了,请原谅以前愚昧无知的我。因为最近做的两个项目都是rpg,
相对以前做的游戏功能模块数,业务逻辑量都成几何倍数增长。
(ps:大概是个二元一次方程?=、= 谁发明的词,唬人,不过我喜欢。)
在这样的情况下,组件模式的优点就凸显出来,一是管理方便直观,二是能解耦,模块分离,
三是拓展性好(也算模块化的优点),插入删除功能方便。
用形(kua)象(zhang)点的说法来,夸比喻一下:
组件模式:
好比是积木,你拼出一个机器人,想换个胳膊拔掉,换一个插上,好使~
脸也不要脸。。拔掉!没有任何问题。
高耦合:
好比是魔方,我这功能不想要了啊,怎么办呢,啪,摔地上,把不要的这块捡起来。
发现以前的东西已经支离破。
(ps:哈哈,小时候为了拼6面,机智的我就拆过魔方~)
上代码
这里只是举例,不是实际使用代码,但包含一些思路:
先上结果把,明白的人就不用往下看了,毕竟时间是宝贵的么=、=
//首先是枚举
enum EMComomponent
{
Start = 0,
Attribute = Start, --方便全部遍历 比如 for(int i = start; i < max; i++)
Show,
Max,
Error,
};
//map是必要的,不然频繁操作,遍历会浪费大量时间。和excel的道理一样。
class Entity
{
public:
template<class T>
T* GetComomponent()
{
return (T*)comomponents[T::getDef()];
};
template<class T>
void AddComomponent(T* t)
{
comomponents[t->getDef()] = t;
};
protected:
map<int, ESComomponent*> comomponents;
};
//基类
class ESComomponent
{
public:
CMPT_DEF_H(ESComomponent)
};
CMPT_DEF_C(ESComomponent, EMComomponent::Error);
//一个显示用的组件,比如用做人物的显示
class ShowComomponent : public ESComomponent
{
public:
CMPT_DEF_H(ShowComomponent);
void hide() { printf("what ??"); }//笑点get到了么=、=
};
CMPT_DEF_C(ShowComomponent, EMComomponent::Show);
就这样我的一个阉割版的组件模式就完成了, 寥寥数行而已。
当然实际上使用上要复杂的多,但是万变不离其宗。
补漏
我知道你要说什么,给你~ 给你!
放在一起不是太乱么=、= 绝对没有其他的心思
#define CMPT_DEF_H(cls) static int getDef();
#define CMPT_DEF_C(cls,v) static int s_em_##cls = v;\
int cls##::getDef()\
{\
return s_em_##cls;\
}
#define INSTANCE_FUNC_H(cls) static cls* getInstance();
#define INSTANCE_FUNC_C(cls) static cls* s_only_##cls = nullptr;\
cls* cls##::getInstance()\
{\
if (s_only_##cls == nullptr)\
{\
s_only_##cls = new cls();\
}\
return s_only_##cls;\
}
总结
基础篇都先写到这里,c++好久没用果然有些生疏了=、=
c++好,c++妙,编译划水呱呱叫。 脚本快、脚本狠,不让休息累死个人。
See Again~
之前
真爱无价,欢迎打赏~