zoukankan      html  css  js  c++  java
  • 网络游戏剧情副本的一种实现方式(中)

      这一节写客户端的具体实现方式。

      为了演示,代码写的比较粗糙。

      我们用一个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 }
  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/fox7nights/p/2644455.html
Copyright © 2011-2022 走看看