QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 749|回复: 4

[原创][意淫版]网络游戏的服务器端

[复制链接]
发表于 2004-8-16 01:43:47 | 显示全部楼层 |阅读模式
网络游戏的服务器端,我分为这么几个部分:
1.数据泵;作用是将数据送往数据解析器,这些数据来自各个网络连接,将被送往合适的数据解析器被解析。
2.数据解析器;作用是解析数据,解析的过程就是根据数据包里的数据,来调用特定的响应函数来对数据包作出响应,并且要给响应函数输入合适的参数。
3.数据响应函数;作用是对数据包作出响应,过程是完成一些行为。

1.数据泵:
数据泵是一个循环,在循环过程中从网络连接读取数据并把数据转交给数据解析器。
在Linux下建议使用poll()……
2.数据解析器:
功能就是根据一些数据来找到某个函数。一般是从数据包里提取出一个消息标识(可能是二进制数据,也可能是字符串),然后根据一个hash表来查找与消息对应的响应函数,找到后调用这个函数,至于函数参数,因为hash表里得用函数指针来管理函数,所以所有消息响应函数的原型都是一样的,其参数必须要让函数能够访问到它所需要的数据,一般要传入两种参数:一是数据包,这样响应函数可以从中提取一些参数;二是游戏数据集的入口,通过这个入口,能够访问到游戏里一切可由响应函数访问的数据,比如可以是一个八叉树的入口。这样就能保证响应函数能够得到它需要的数据,找到它要用到的对象。另外,如果用户控制的游戏角色在服务器端体现为一个对象,那么可以在对象所属的类里建立一个static的hash表,在服务器初始化时,从一个动态连接库里读取响应函数:比如在Linux下,先打开一个连接库,然后按照约定调用一个函数来得到这个连接库里所有响应函数的函数名以及这些函数所对应的消息标识,这时就可以把消息标识(不管是不是字符串,反正当成二进制数据处理)当作hash表里一个元素的name,把对应函数的地址当作这个元素的value。这样,这些函数都可以当作类的成员函数来看待,所以当数据泵“泵入”一个数据包时,让数据泵把数据包交给发送者(客户端)所对应的人物对象,通过调用这个人物对象的call_by_name()成员函数来把数据包以及游戏数据集入口交给适当的响应函数(直接把数据包传给call_by_name(),它会自己提取消息标识,并调用响应函数)。另外,由于那个类的所有实例在调用“成员函数”时都是通过同一个hash表来查找函数的,所以在游戏运行期间,还可以重新载入其他的连接库,以改变响应函数的实现而不用重启游戏,并且在重新载入之前创建的对象也会使用新载入的响应函数。
3.数据响应函数:
它将分析数据包里的数据,并作出反应,反应的过程将可能调用其他对象的成员函数以进行一些操作,而这些对象可以通过游戏数据集入口来查找。

数据泵其实就是所谓的“网络层”
而响应函数则完成了游戏逻辑的处理、物理逻辑处理等功能。当然,响应函数也能用来制作任务、体现剧情。
另外,上述数据泵只能带来一个只有被动响应的系统,如果想让游戏里的NPC有主动行为,可以在数据泵的循环中增加一个操作:调用NPC的breathe()成员函数。而那些被动行为可以在响应函数里体现,比如玩家A发数据包说要攻击一个叫B的NPC,在响应函数里就会是调用A的attack(B)成员函数,而A的attack()成员函数里则会调用B的be_attacked(A)成员函数,在B的be_attacked()函数里有一些代码会计算并减少B的生命值,另外还有一些代码来对“被攻击了”这个事件作出反应。
发表于 2004-8-16 11:38:12 | 显示全部楼层
油++!

这些引擎都已经实现了么?

打算要做的是什么游戏,类CS第一人称视角对战还是星际般的即时战略或是奇迹那样的虚拟世界?
回复

使用道具 举报

 楼主| 发表于 2004-8-16 15:18:47 | 显示全部楼层
恩 ……主要用来做传奇那种网游(当然不会像传奇那么垃圾)~~
不过关键问题是……代码还没怎么写呢……
回复

使用道具 举报

发表于 2004-8-16 15:23:05 | 显示全部楼层
  
回复

使用道具 举报

发表于 2004-8-16 19:31:03 | 显示全部楼层
不用急着写代码,先将理论过一遍不是更好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 15:46 , Processed in 0.035459 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表