RakNet 消息与函数的绑定 一个消息对应多个函数

上一篇做了RakNet 一个消息与一个函数的绑定,但实际上一个消息有时候会对应多个函数,这时候我们可以用Vector把消息处理函数存起来,然后当消息发过来的时候,循环执行所有的处理函数


在上一篇的源代码做了 添加Vector 的修改。


#include <iostream>
#include <windows.h>
#include<string>
#include <map>
#include <vector>


using namespace std;

enum GameMessage
{
	GM_LoginReturn,
	GM_getUserInfoReturn,
	GM_EverydayDrawReturn,
	GM_FriendExtendReturn
};


void getRequestLoginReturn()
{
	cout<<"Slot0 getRequestLoginReturn"<<endl;
}

void getUserInfoReturn()
{
	cout<<"Slot1 getUserInfoReturn"<<endl;
}

void getRequestEverydayDrawReturn()
{
	cout<<"Slot2 getRequestEverydayDrawReturn"<<endl;
}

void getFriendExtendOpenReturn()
{
	cout<<"Slot3 getFriendExtendOpenReturn"<<endl;
}

typedef void(*funct)();  //函数类型,代表返回值为空,参数为空的函数指针类型
map<unsigned long,vector<funct>> m_msgMap;
typedef map<unsigned long,vector<funct>> MSGMAP;


vector<funct> slotFuncVec; //一个信号对应的所有槽函数


void registerMessageHandle(unsigned long type,funct f);
void fireMessage(unsigned long type);

int main()
{
	registerMessageHandle(GM_LoginReturn,&getRequestLoginReturn);
	registerMessageHandle(GM_LoginReturn,&getRequestEverydayDrawReturn);
	registerMessageHandle(GM_LoginReturn,&getFriendExtendOpenReturn);

	registerMessageHandle(GM_getUserInfoReturn,&getUserInfoReturn);
	registerMessageHandle(GM_EverydayDrawReturn,&getRequestEverydayDrawReturn);
	registerMessageHandle(GM_FriendExtendReturn,&getFriendExtendOpenReturn);

	cout<<"注册了 "<<m_msgMap.size()<<"  条消息"<<endl;

	int msgCin;

	while(1)
	{
		cout<<"输入事件ID:";
		cin>>msgCin;

		fireMessage(msgCin);

		Sleep(10);
	}

	return 0;
}

void registerMessageHandle(unsigned long type,funct f)
{
	slotFuncVec.clear();

	MSGMAP::iterator typeIter=m_msgMap.find(type);

	if (typeIter!=m_msgMap.end())  //原来有直接在对应type的vec后面插入
	{
		typeIter->second.push_back(f);
	}
	else
	{
		slotFuncVec.push_back(f);
		m_msgMap.insert(pair<unsigned long,vector<funct> >(type,slotFuncVec));
	}
}

void fireMessage(unsigned long type)
{
	MSGMAP::iterator typeIter=m_msgMap.find(type);
	if (typeIter==m_msgMap.end()) return;

	//如果找到了这个注册消息,那么就执行这个消息对应的函数,因为一个消息可以对应多个函数,所以用vector把所有的函数存储,然后循环执行

	for (int i=0;i<typeIter->second.size();i++)
	{
		((typeIter->second)[i])();
	}
}

程序运行图:


RakNet 消息与函数的绑定 一个消息对应多个函数_第1张图片

你可能感兴趣的:(C++,RakNet)