游戏策划咨讯
做一个游戏并不难,难的是做一个好游戏;完美在于积累!
 

场景管理之消息发送

    好久没有写东西出来和大家共同揣摩,真是对不住大家了。现在终于腾了一些时间来继续和大家研究网络游戏制作技术,在这一节中,我就要向大家介绍网络游戏服务器中World场景划分和场景中消息分发问题。

    在前面我基本向大家讲述的都是一些基本的技术问题,从某种意义上讲。属于纯技术范畴的东西,但现在要向大家讲的,应该是属于服务器功能设计范畴的。在这里,我未必讲的很好,有遗漏之处就请大家谅解和指正。

    对于有一定游戏服务器开发基础的朋友而言,应该都明白一个网络游戏服务器和客户端之间的一个基本关系: 玩家客户端是游戏服务器一个局部COPY表现。这个说法听起来可能有一些绕口,简单的解释下也就是说:客户端所具备的区域信息也就是游戏服务器相同区域数据的一份COPY,而表现的意思,也就是说,CLIENT端将这样的数据信息图形化,并且通过屏幕来进行显示,从而来呈现出一个多姿多彩的游戏世界。这样说大家应该能够听懂了吧?再不懂的话,就自己琢磨了。

    说了上面那么多,大家一定要问“SERVER和CLIENT这种关系和我们的消息发送又有什么关系呢?”。其实,我们要讨论的问题点也就在这里。但现在我还不说场景消息到底该如何进行分发。我们还是再来研究一个问题:什么能够使我们的游戏世界变的内容丰富?
大家先不要看我所说的,先自己想想。

    大家应该都思考过了,我就来说一下我的个人想法和理解,可能和大家不一样(我想到的你没有想到的你补上,反之,我补上)。

    在我们的MMOPRG游戏世界中,造成游戏世界变的丰富多彩一般无外乎两个大方面:NPC动作、玩家动作。呵呵,看起来就只有简单的两个方面,但具体分析这些动作起来,可就会让各位包括我都会头大的。先我们来说NPC动作吧,NPC动作通过AI逻辑进行控制,一般情况可以分为一下几个动作:待机、移动、物理攻击、技能攻击、魔法攻击、死亡等,而游戏中玩家动作的产生是由现实中玩家进行操控的,动作类型基本上也不外乎以上几种。既然在服务器游戏世界中存在这样的一些动作,那是如何进行获取的呢?其实就只有两个字:消息(Message)。而消息的产生方又分为两种:Client消息,Server消息。既然有消息产生,我们就将涉及到另外一个问题:如何将产生的消息分发出去呢?

    下面通过我自己的实现经验来简单介绍场景消息的分发原理(详细介绍写的太多,有点懒!!),应该不是最佳的,我只是提一个开头,更好的处理实现方式还是需要大家来共同研究。有好的想法也希望告诉我下,我也从中学习些新的东西。

    先看场景示范图(我画的,比较土,只是表明一个意思。呵呵)


 
    通过上面设计示范图,我来具体介绍:关于场景消息分发,我的设计和分析过程:
    第一步:将场景网络化,也就是说将我们的游戏服务器大场景进行逻辑上的区域划分,每个单独区域所占的面积可以考虑比屏幕区域稍微大点。同时为每一个单独的区域创建Player标志信息(SOCKET或者其他)列表。

    第二步:将单独区域四分化,也就是说对于每一个小区域,再次划分为四个更加小的区域,同时为每一个小的区域建立一个包含三个对象的整数数组。数组的作用是为了保存此小区域的亲缘区域。例如: 小区域1的亲缘区域就是: A、B、H,小区域2的亲缘区域就是:B、C、D等。

    第三步:在上面两步基础上,就是实际处理消息分发了。如果Player/NPC在区域中进行消息动作,我们通过Player/NPC的当前位置就可以首先确定Player/NPC所在大地图中的具体区域。在我们确定好了具体的区域后,我们要继续确定在那个具体的小区域。在这些小区域都确定后,我们就可以将我们的动作消息发送到亲缘区域中的Player(玩家)。

    第四步:对于第三步的改变优化,用CPU处理量来换取消息数量,具体做法也就是,在亲缘区域中继续区域化。也就是说消息不是发送到亲缘区域中的所有Player(玩家),而是有选择的发送到自身一定区域的玩家。这种优化改革从某种意义上讲,可以减少服务器总消息数量,但增大CPU处理量,而对于具体实现,就需要大家去权衡了。

    以上也就是这个分析和处理过程了。同时关于这个场景处理的.h文件,我也就简单的写下,大家参考了。


Class    GmapRegion
{
   public:
GmapRegion();
~ GmapRegion();
void   GetBoardCastMsgList(POINT current_pos,LIST *);  //获取当前位置广播消息的Player列表。
……..
   private:
        void   Init();
        voud   Release();
        bool   InitMapRegion(int  map_wis,int map_hei);         //地图区域化
        
   protected:
}


posted on 2005-02-13 11:56 蓝色雪焰 阅读(561) 评论(1)  编辑  收藏 所属分类: 网络游戏
Comments

只有注册用户登录后才能发表评论。


网站导航: