虽然宏能减少重复代码编写,提高效率,但是属于机器语言,与人不太以好。不直观,不好调试。以下主要例举kbe中常用到的宏展开后的样子,以方便理解,阅读。
文件(client_interface.h),客户端消息处理,RPC调用过程类:
消息:onHelloCB
类定义:
//消息处理者
class onHelloCBClientMessagehandler_stream : public Network::MessageHandler {
public:
virtual void handle(Network::Channel* pChannel, KBEngine::MemoryStream& s);
};
//全局变量,处理者实例
extern const onHelloCBClientMessagehandler_stream& onHelloCB;
//消息参数
class onHelloCBArgs_stream : public Network::MessageArgs {
public:
onHelloCBArgs_stream():Network::MessageArgs(){}
~onHelloCBArgs_stream(){}
virtual int32 dataSize(void) { return -1; }
virtual MessageArgs::MESSAGE_ARGS_TYPE type(void) {
return MESSAGE_ARGS_TYPE_VARIABLE;
}
virtual void addToStream(MemoryStream& s) { }
virtual void createFromStream(MemoryStream& s) { }
};
类实现:
//消息处理的handle过程
void onHelloCBClientMessagehandler_stream::handle(Network::Channel* pChannel,
KBEngine::MemoryStream& s) {
KBEngine::ClientApp::getSingleton().onHelloCB(pChannel, s);
}
//创建并添加消息处理过程
onHelloCBClientMessagehandler_stream* ponHelloCB =
static_cast<onHelloCBClientMessagehandler_stream*>(
messageHandlers.add("Client""::""onHelloCB",
new onHelloCBArgs_stream,
-1, new onHelloCBClientMessagehandler_stream));
//初始化全局变量的值
const onHelloCBClientMessagehandler_stream& onHelloCB = *ponHelloCB;
再看一个多个参数的实现(onCreatedProxies):
//消息处理器
class onCreatedProxiesClientMessagehandler3 : public Network::MessageHandler {
public:
virtual void handle(Network::Channel* pChannel, KBEngine::MemoryStream& s);
};
//处理器实例
extern const onCreatedProxiesClientMessagehandler3& onCreatedProxies;
//消息参数
class onCreatedProxiesArgs3 : public Network::MessageArgs {
public:
uint64 rndUUID;
ENTITY_ID eid;
std::string entityType;
public:
onCreatedProxiesArgs3():Network::MessageArgs() {
strArgsTypes.push_back("uint64");
strArgsTypes.push_back("ENTITY_ID");
strArgsTypes.push_back("std::string");
}
onCreatedProxiesArgs3(uint64 init_rndUUID,
ENTITY_ID init_eid,
std::string init_entityType): Network::MessageArgs(),
rndUUID(init_rndUUID),
eid(init_eid),
entityType(init_entityType) {
strArgsTypes.push_back("uint64");
strArgsTypes.push_back("ENTITY_ID");
strArgsTypes.push_back("std::string");
}
~onCreatedProxiesArgs3(){}
static void staticAddToBundle(Network::Bundle& s,
uint64 init_rndUUID, ENTITY_ID init_eid, std::string init_entityType) {
s << init_rndUUID; s << init_eid; s << init_entityType;
}
static void staticAddToStream(MemoryStream& s,
uint64 init_rndUUID, ENTITY_ID init_eid, std::string init_entityType) {
s << init_rndUUID; s << init_eid; s << init_entityType;
}
virtual int32 dataSize(void) {
return sizeof(uint64) + sizeof(ENTITY_ID) + sizeof(std::string);
}
virtual void addToStream(MemoryStream& s) {
s << rndUUID; s << eid; s << entityType;
}
virtual void createFromStream(MemoryStream& s) {
s >> rndUUID; s >> eid; s >> entityType;
}
};
处理器实现:
//handle过程
void onCreatedProxiesClientMessagehandler3::handle(
Network::Channel* pChannel,
KBEngine::MemoryStream& s) {
uint64 rndUUID;
s >> rndUUID;
ENTITY_ID eid;
s >> eid;
std::string entityType;
s >> entityType;
KBEngine::ClientApp::getSingleton().onCreatedProxies(
pChannel, rndUUID, eid, entityType);
}
//实例赋值
onCreatedProxiesClientMessagehandler3* ponCreatedProxies =
static_cast<onCreatedProxiesClientMessagehandler3*>(
messageHandlers.add("Client""::""onCreatedProxies",
new onCreatedProxiesArgs3, -1,
new onCreatedProxiesClientMessagehandler3));
const onCreatedProxiesClientMessagehandler3& onCreatedProxies = *ponCreatedProxies;