2D网络游戏开发(网络篇)(十)

原创 2006年06月22日 11:45:00
2D网络游戏开发(网络篇)(十)
 
作者:akinggw
 
前言
 
其实,我也很想将游戏开发简单化,可不管我怎么努力,游戏开发还是那么难,还是涉及那么多知识。同样,在这里,我也希望我的翻译和讲解能够让你明白,为了使你和我更容易地理解游戏开发的内容,因此你的反馈对我很重要,我的邮箱是akinggw@126.com 。欢迎你提出你宝贵的意见。最近天气比较热,因此,我也改编程为翻译,希望没有译错。
 
发送数据包
 
决定你的数据
 
关于这个东西,已经在建立数据包那一篇讲解了,你最好翻看前面的内容。
 
决定使用那种方式来进行
 
你通常是想发送一个触发动作的标志,而不是发送动作的结果。通常来说,一个数据包的来源主要集中在下面三个方面:
 
来自于一个函数来触发动作
来自于一个标志驱使函数去触发动作
来自于一个数据管理器
 
它们每种方法都有自己的优点和缺点。
 
来自于一个函数来触发动作
 
例子:
假如我们有一个函数叫ShootBullet,带有大量的参数,包括射击的方式,在哪里射击和向哪个方向射击。每次ShootBullet函数一旦调用,那么我就将发送一个数据包去告诉网络,已经有事情发生了。
 
这种方法的优点
 
很容易维护。ShootBullet函数可能在许多不同的地方被调用(比如,鼠标输出,键盘输出,AI等),因此,我们就不得不保证在每一个接收到的地方的一致性。这种方法在现在的单玩家游戏中很容易实现。
 
这种方法的缺点
 
编程实现很难。如果我用ShootBullet去初始那个包,那么当网络想实现这个函数时,它将调用什么?如果ShootBullet初始那数据包,并且网络调用ShootBullet函数,那么另一个数据包将寄出,建立一个反馈循环。因此,我能写另一个函数,比如DoShootBullet,或者传输一个参数到ShootBullet,告诉它是否发送一个数据包。我们也不得不考虑授权,客户端是直接发出子弹,还是在发出子弹之前,要经过服务器授权?如果需要授权,那么ShootBullet将发送一个数据包并且马上返回,只有一种情况不会返回,那就是它被网络调用并且它不能发送数据包。那网络也许还需要一些ShootBullet函数没有的附加信息,比如子弹存在的数量。有时这些可以从上下文中得到,但是有时也不能。
 
来自于一个标志驱使函数去触发动作
 
我们还是使用上面的例子,但这次有一点不同,我们这次是在ShootBullet函数内部发送数据包,而何时发送数据包是通过一个标志来确定。例如,当用户点击鼠标,AI决定射击或空格键被按下。
 
优点
 
我可以在网络中调用ShootBullet函数,而不用担心返回循环。并且我将得到更多函数以外的信息可以利用。因此,利用网络,可以很容易地发送数据。
 
缺点
 
难于维护。如果我稍后添加另一种方法射击子弹,可能我会忘记发送数据包。
 
来自于一个数据管理器
 
例子
 
每次,一个玩家的生命值到达0,发送一个数据包。不管怎样,我不会这样做。我会把它添加到一些运行每一帧的一些函数里,也许在代码中实现玩家的更新。当代码发现玩家的生命值是0时,它马上发送一个数据包。然后注册这个已经发送的数据包以避免又一次重新被发送。
 
优点
 
从网络来看,非常的清楚。我不得不担心反馈和在实际动作中改变那函数。不用维护,除非一些人改变了它。还有就是非常的高效。
 
缺点
 
但是从设计的角度讲,非常的不整洁并且只能用于数据的一定类型。另外就是不得不反复设置。
 
决定可靠性的类型和你需要什么样的顺序流
 
PcaketPriority.h 包含了可靠性的类型。你需要从三中级别中作出选择:HIGH_PRIORITY, MEDIUM_PRIORITY, LOW_PRIORITY
高可靠性的数据包比中可靠性的数据包先寄出,而中可靠性的数据包比低可靠性的数据包先寄出。在游戏中,你将用RELIABLE_ORDERED来设置数据包。
 
调用客户端的服务器的发送函数
 
发送函数并不会改变你的数据,但是会做一次拷贝。
 
顺序流
 
对于顺序数据包,有32种顺序流,而对于连续的数据包,同样有32种顺序流。你能把流想象成一种相关的顺序流,它们所有的数据包拥有相同的顺序类型。我们可以举一个例子来描述这个东西。假设你想排序所有的聊天信息,排序所有的玩家移动数据包,排序所有的玩家开火包,连续所有的弹药数据包。你想使聊天信息按顺序到达,又不想聊天信息被挂起,因为你不能很容易的得到玩家移动的数据包。玩家移动数据包并不和聊天信息关联,因此,你不用担心他们是按照什么顺序到达。这样,你就可以为他们使用不同的顺序流,也许,0表示聊天信息,1表示玩家的移动数据包。值得一提的是玩家的开火数据包的顺序应该和玩家移动的数据包相关,因为你不想在错误的位置进行开火。因此,你应该将玩家开火的数据包放在和玩家移动数据包相同的数据流里。这样做的好处就是如果开火数据包比移动数据包后到达,开火数据包不会给你任何东西,它会一直等待移动数据包的到达。
 
序列将不停地剔除老的数据包,因此,如果你得到包的顺序为213,那么你将开始收到21,然后这些包被剔除,最后你将得到数据包3。这对于弹药来说非常的有用,因为弹药就只是不断地下降。如果你得到一个很老的包,那你就将得到很多的弹药,这明显是个错误。值得注意的是序列数据包不同于顺序数据包,因为顺序数据包是用一组流来表示的。
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 

网络(Java核心技术卷Ⅱ)

网络 1 连接到服务器 网络 3.1 连接到服务器 打开一个套接字:Socket s=new Socket(address,port); 套接字是网络软件中的一个抽象概念,负责...
  • rename_to
  • rename_to
  • 2016年05月08日 16:37
  • 338

一步一步构建你的iOS网络层 - HTTP篇

本文来自简书,原文地址:http://www.jianshu.com/p/f9b4ada163ab 缘起 经常跑步的人一定知道, 每次跑步时间过了15分钟以后, 脑子里通常就开始出现: 青...
  • qq_30513483
  • qq_30513483
  • 2017年02月17日 11:45
  • 418

TCP/IP 教程(针对LINUX的网络基础请参看 《鸟哥的Linux私房菜 服务器架设篇(第三版) 》)

TCP/IP 是针对因特网的通信协议。 在此教程中,你将了解到什么是 TCP/IP,以及它如何工作。开始学习 TCP/IP ! TCP/IP 是因特网的通信协议。 通信协议是对计算机必须遵...
  • u010794281
  • u010794281
  • 2015年09月16日 18:31
  • 1534

网络流Edmond-Karp算法

前阵子都在忙PHP的事,没有时间去更新博客,今天下午终于狠下心来学网络流,在这里讲一下网络流Edmond-Karp算法的基础内容。至于网络流的一些基础概念,这里就不说明了,大家可以去百度或看书。其思想...
  • ColorWaterer
  • ColorWaterer
  • 2014年11月17日 23:28
  • 525

网络流基础篇——Edmond-Karp算法

BY纳米黑客  这是我的一个初学者教程系列的一部分,也是这个系列的第一篇文章,这个系列计划中将包括网络流,线段树,树状数组等一些初学者比较难以入门的内容。  因为是初学教程,所以我会尽量避免繁杂的数学...
  • u010255534
  • u010255534
  • 2013年12月29日 19:36
  • 741

Android 各大网络请求库的比较及实战

自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个。本篇文章对常见的网络请求库进行一个总结。HttpUrlConnection最...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年05月11日 09:30
  • 17154

基础网络概念

摘自《鸟哥的 Linux 私房菜-网络篇》 局域网络 (Local Area Network, LAN) 广域网 (Wide Area Network, WAN) MAC (Media Ac...
  • breeze_life
  • breeze_life
  • 2013年08月07日 18:17
  • 1899

Redis网络库源码分析(1)之介绍篇

一、前言Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析。其实网上已经有非常多有关这个网络库的...
  • yangbodong22011
  • yangbodong22011
  • 2017年03月23日 15:30
  • 900

Windows网络编程(基础篇1)

Windows网络编程(基础篇1) Winsock是一种网络编程接口,不是协议。 除了WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError属于W...
  • zt_xcyk
  • zt_xcyk
  • 2017年03月10日 15:21
  • 527

iOS开发网络篇—实现一个视频播放客户端小应用(一)

转自:http://www.cnblogs.com/wendingding/p/3815052.html 一、初步实现(完成tableview的基本数据展示) 1.前提说明 已经搭建了本地服务...
  • gf771115
  • gf771115
  • 2015年04月16日 13:25
  • 2884
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2D网络游戏开发(网络篇)(十)
举报原因:
原因补充:

(最多只允许输入30个字)