2D网络游戏开发网络篇 二十2D网络游戏开发网络篇 二十
前言
有几天没有发东西了,在我的记忆里,好象有两天。难怪手痒痒的,这两天在做一个网站,刚刚把关键的技术问题解决,所以没有多少时间写文章。在加上最近这几天又比较热,40几度,吓人~还是回到我们的正题上吧,就是关于网络游戏的制作,今天我不想编程,只是想谈谈游戏服务器的结构。
结构
其实,我们的游戏传输的就是结构,精灵结构,NPC结构,物品结构,聊天信息结构等等很多结构。(这只是我的想法,有可能有错,不要太当真)
我们下面来做一个例子,比如我们所操作的角色。它应该包含哪些东西呢,她叫什么名字,...
2D网络游戏开发网络篇 二十
前言
有几天没有发东西了,在我的记忆里,好象有两天。难怪手痒痒的,这两天在做一个网站,刚刚把关键的技术问题解决,所以没有多少时间写文章。在加上最近这几天又比较热,40几度,吓人~还是回到我们的正题上吧,就是关于网络游戏的制作,今天我不想编程,只是想谈谈游戏服务器的结构。
结构
其实,我们的游戏传输的就是结构,精灵结构,NPC结构,物品结构,聊天信息结构等等很多结构。(这只是我的想法,有可能有错,不要太当真)
我们下面来做一个例子,比如我们所操作的角色。它应该包含哪些东西呢,她叫什么名字,她所在的地图号,在地图的某个地方,有多少等级,她的经练值是多少,其它还有她穿什么装备,使用什么功夫等等信息。
当然我们前面所说道的装备,功夫,又是另一个结构。
下面我们就用语言的方式来描述她。
角色她
所在地图号
所在地图坐标
精练值是多少
所穿的装备
所使用的功夫
这些数据一旦接收,游戏引擎就可以根据这个结构中的信息做相应的动作。比如根据角色所在地图号加载地图,然后根据角色的坐标信息显示精灵。最后显示其它相关的信息。
这些东西是如何在客户端生成的呢?
我们可以跟踪这个过程。
1.玩家打开游戏,输入名称和密码。(我们假定他们是在网站上注册的);
2.服务器接受玩家资料,如果是登陆信息,就检测玩家的名称和密码。如果正确,再检测玩家是否第一次登陆,如果是第一次,就为玩家初始化上述结构中的信息,然后发送给客户端,同时写入数据库;如果玩家不是第一次登陆,就从数据库中取出相关信息,发送给客户端。同时服务器还要建立一个玩家链表,用于管理这些玩家信息。关于玩家在服务器上的管理,光一根链表是不行的,如果游戏是一个小游戏,只有一张地图可以但有多张地图时,或人数很多时,一根链表就不能解决问题了。即使能,那速度就会受到影响,因为它是在一个很长的路上来回跑动啊。这显然不行。最好的办法就是有多少张地图就建立多少根链表。这时又有一个问题,就是当玩家从一张地图到了另一张地图,怎么办呢?这个也是有解决办法的,因为我们的玩家在游戏中都拥有唯一的ID,又因为每次客户端都会回传数据。这时我们先根据玩家回传的玩家ID在所有地图中查找它属于哪个链表,找到地图的ID号,然后和玩家回传的地图ID进行比较,如果相等就不改,如果不相等,先删除服务器上的地图ID所指的链表中的玩家,然后将这个回传的数据重新插入它所在的地图ID所指的链表。(希望我的讲解不会让你迷惑)这样就解决了玩家在服务器上的管理问题。也许你要问,这样做的好处是什么?那我就可以告诉你,这样做的好处有很多:A.节省了查找玩家的时间,比如你向你所在地图的某个玩家发动进攻,总不能每次都把服务器中的全部玩家都遍历一次。B.方便地图的管理比如你在一个游戏地图中奔跑,如何显示你周围的NPC和其它玩家呢?不可能每次都去服务器得到你周围的情况吧,即使允许,可能数据传输过来时,你已经到了另一个地方。最好的办法就是在游戏开始之前将地图中所有的情况传输到你的客户端,这样才能达到同步显示。而对于地图中情况的改变,那就成了一个一个的事情,可以在这些情况改变时,只对你的情况列表做一些小的动作,这样就不会影响大局了。但这种
方法只适合与小的地图,对于想《传奇》那样的超大地图就行不通了。这时,我们就可以用一个四叉树来解决,看下图:
我图画的不好,只为说明一个问题,按照我们前面所说的,把地图分成一根根链表来存储。但当我们使用的是超大地图,那同样将遇到很多速度上的问题。如何来提高这个查找速度呢?
我认为把上面我们所用到的链表换成四叉数,什么是四叉树?看下面就明白
了:图注1
四叉树的作用就是把一个平面一分为四,这样我们就能把《传奇》中的地图分成一些很小的方块。至于这些方块要分到多小,你可以通过设置四叉树的深度来决定,当然不能太小了。
我们还是使用链表来存储玩家的信息,而这些链表应该预先定义,需要多少,就定义多少,然后将这些链表的ID好存储到四叉树的叶节点中。这样,我们每次我们查找玩家信息就可以先在四叉树中找到链表ID,然后在链表中进行操作,速度有提升了不少。当然这种方法对于那种超大的地图才有效果,如果地图不大,还是采用前面的方法吧。
前面这个方法不仅要管理玩家,同时地图中的物品,NPC,也是这样管理。
1.这一步就是将玩家所在的地图中的物品,NPC,等等信息发送给玩家;
2.玩家接收到自己的信息和地图中的所有信息,然后显示。
3.这时,玩家就会响应某些动作,比如移动人物,攻击别人等等动作。这里就有两个方面,玩家自身的改变和玩家对他人的改变。我们先说说玩家自身的改变,对于这个方面,先修改客户端,然后将数据传输到服务器,修改数据库,修改地图链表。经过仔细观察,我发现对于游戏中所有的对象不外乎三种操作:删除,更新,添加。你可以自己去想一下,任何东西都只有这三种操作。这样的话,我们就不得不在将我们的数据包改成下面的样子:
数据包
数据包类型;
数据包子类型;
角色她
所在地图号
所在地图坐标
精练值是多少
所穿的装备
所使用的功夫
这个数据包中的第一个类型代表数据包的类型,比如它代表了什么对象,是玩家,物品还是NPC。第二个类型代表了对这个数据包中的数据实行何种操作,是删除,修改,还是增加。
以上说的只是玩家自身的改变。而玩家对其它对象的改变呢?
我在这里也不是太清楚,不过有一种方法就是就是发消息到服务器,然后让服务器自己来处理这些事情。
4.玩家关闭客户端,然后退出。
我想这就是客户端和服务器实现的大概过程。
Over~
不知道你们看没看懂,后面我将借助一个不完整的代码实现客户端玩家的管理。
本文档为【2D网络游戏开发网络篇 二十】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。