這一節寫客戶端的具體實現方式。
為了演示,代碼寫的比較粗糙。
我們用一個EventCenter作為事件ID和事件的路由表,即根據某ID,即可定位到某處理事件的具體類,并根據參數處理這個事件。
前臺應該有個類似這樣的配置:
<group id = 0>
<event id =xx paramint1=xx paramint2=xx paramstr= xx>
....
</group >
<group id = 1>
</group>
我簡單處理成了直接賦值,關于數據結構的定義,都較簡單的使用了map,實際工作中,可根據情況做相應處理,這里僅說明一下大體原理
#include<map>
using namespace std;
struct Event
{
int eventid;
string parastr;
int paraint1;
int paraint2;
};
struct Group
{
enum { MAX_EVENT = 5};
int eventnum ;
Event events[MAX_EVENT];
};
struct EventCenter;
class Client
{
public:
enum EventType {
EVENT_NOTICE = 0, //彈提示
EVENT_CAMERA_MOVE =1 ,//移鏡頭
EVENT_TRANSPORT = 2 //傳送
};
public:
Client(void);
~Client(void);
public:
int loadfile();
int run();
public:
void setgroupid(int id ){ groupid = id;};
void setcenter(EventCenter* c){ center = c;}
private:
typedef map<int,Group> Groups;
typedef map<int,Group>::iterator Iterator;
Groups config;
int groupid;
EventCenter* center;
};
//事件類的父類,通過虛特性,EventCenter將調用子類的handle
class EventHandle
{
public:
virtual int handle(Event* event)=0;
};
//將事件陸由到各個事件處理類
struct EventCenter
{
enum { MAX = 3};
public:
void registerHandle(int id ,EventHandle* event){
eventhandles[id] = event;
}
void handleEvent(int id,Event* e ){
eventhandles[id]->handle(e);;
}
private:
EventHandle* eventhandles[MAX];//為了演示方便,這個路由表簡單表述成數組下標為鍵的結構
};
///具體處理事件的類,可無限添加,只要在EventCenter中注冊即可
//提示類
class NoticeEvent: public EventHandle
{
int handle(Event* event){
printf("新手指導員: %s\n",event->parastr.c_str());
return 0;
}
};
//移鏡頭
class MoveCameraEvent: public EventHandle
{
int handle(Event* event){
printf("鏡頭移動到x=%d y=%d\n",event->paraint1,event->paraint2);
return 0;
}
};
//傳送
class TransportEvent: public EventHandle
{
int handle(Event* event){
printf("將玩家傳送至 場景 %d \n",event->paraint1);
return 0;
}
};
1 #include "StdAfx.h" 2 #include "Client.h" 3 #include "luainc.h" 4 5 Client::Client(void) 6 { 7 } 8 9 10 Client::~Client(void) 11 { 12 } 13 int Client::run() 14 { 15 Iterator it = config.find(groupid); 16 17 if( it != config.end() ){ 18 Group g = it->second; 19 int eventid = -1; 20 Event ev ;; 21 for(int i = 0; i < g.eventnum; i++ ){ 22 eventid = g.events[i].eventid; 23 ev = g.events[i]; 24 center->handleEvent(eventid,&ev); 25 } 26 } 27 return 0; 28 } 29 int Client::loadfile() 30 { 31 Group group0; 32 group0.events[0].eventid = EVENT_NOTICE; 33 group0.events[0].parastr = "少俠,歡迎來到新手村,最近野豬一直在騷擾村子,你去打幾只吧"; 34 35 group0.events[1].eventid = EVENT_CAMERA_MOVE; 36 group0.events[1].paraint1 = 100; 37 group0.events[1].paraint2 = 200; 38 group0.eventnum = 2; 39 40 Group group1; 41 group1.eventnum = 1; 42 group1.events[0].eventid = EVENT_TRANSPORT; 43 group1.events[0].paraint1 = 211314; 44 45 config.insert(pair<int,Group>(0,group0)); 46 config.insert(pair<int,Group>(1,group1)); 47 48 return 0; 49 }
浙公網安備 33010602011771號