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表示玩家的移动数据包。值得一提的是玩家的开火数据包的顺序应该和玩家移动的数据包相关,因为你不想在错误的位置进行开火。因此,你应该将玩家开火的数据包放在和玩家移动数据包相同的数据流里。这样做的好处就是如果开火数据包比移动数据包后到达,开火数据包不会给你任何东西,它会一直等待移动数据包的到达。
序列将不停地剔除老的数据包,因此,如果你得到包的顺序为2,1,3,那么你将开始收到2,1,然后这些包被剔除,最后你将得到数据包3。这对于弹药来说非常的有用,因为弹药就只是不断地下降。如果你得到一个很老的包,那你就将得到很多的弹药,这明显是个错误。值得注意的是序列数据包不同于顺序数据包,因为顺序数据包是用一组流来表示的。
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 

2D网络游戏开发(网络篇)(十)相关推荐

  1. 2D网络游戏开发(网络篇)(一)

    2D网络游戏开发(网络篇)(一)   来源: ChinaUnix博客 日期: 2006.05.26 11:16 (共有0条评论) 我要评论   作者:akinggw "2D网游开发" ...

  2. 2D网络游戏开发(网络篇)(五)

    2D网络游戏开发(网络篇)(五)   作者:akinggw   在第四篇中,我们学习了如何使用raknet进行服务器和客户端的连接,在这一篇中,我们将讲解如何让客户端和服务器进行通信,比如说聊天. 好 ...

  3. 2D网络游戏开发(网络篇)(四)

    2D网络游戏开发(网络篇)(四)   作者:akinggw   在上一篇中,我们只是讲解了如何建立一个服务器或客户端.这一篇中,我们将讲解客户端如何和服务器进行连接.   #include " ...

  4. 2D网络游戏开发(网络篇)(二)

    2D网络游戏开发(网络篇)(二)   作者:akinggw 在上一章中,我简单的讲解了什么是Raknet,它有那些好处.在这一章中,我们将讲解如何在IDE中配置Raknet,并将测试一个程序. 由于R ...

  5. 2D网络游戏开发(网络篇)(六)

    2D网络游戏开发(网络篇)(六)   作者:akinggw   在前面的章节中,我们实现了一个简单的聊天室.今天,我们仍然要围绕这个主题,但采取别的方法,这个方法很有用,应该说是整个网络引擎的关键,它 ...

  6. iOS开发网络篇—多线程断点下载

    iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  7. iOS开发网络篇—使用ASI框架进行文件下载

    iOS开发网络篇-使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYView ...

  8. iOS开发网络篇—数据缓存

    iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以 ...

  9. 02.iOS开发网络篇—HTTP协议

    iOS开发网络篇-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...

最新文章

  1. find 按时间查找
  2. 计算机科学与导论期末论文题目,★计算机科学与技术导论论文题目计算机科学与技术导论毕业论文题目大全计算机科学与技术导论论文选题参考(3页)-原创力文档...
  3. 王孟源:中国要崛起,基础科研需要“讲实话
  4. java学习(37):二维数组
  5. c++exe程序在别人电脑上双击无法打开_Windows10电脑磁盘占用率过高,用这二招轻松解决...
  6. 当你和天猫精灵对话时,它在想什么?阿里智能对话技术深度解读
  7. 针对Properties中实时性要求不高的配置参数,用Java缓存起来
  8. python分类器鸢尾花怎么写_python机器学习基础教程:鸢尾花分类
  9. QTP中实现对文本文件(txt)的读写操作
  10. airpods pro是按压还是触摸_AirPods Pro体验:真好用,但我还是想退货啊
  11. log4j不生成日志文件的问题
  12. python的类是什么_Python类(class)
  13. 华科大计算机跨考,华中科大计算机概况_跨考网
  14. python修改txt里面的内容_python修改txt部分内容,并保存。
  15. 人工智能与深度学习实战(4)——口罩佩戴识别(CNN)
  16. Android高级模糊技术[转]
  17. 当游戏遇到区块链之链游经济系统思考
  18. intel网卡win10 修改mac
  19. 腾讯微博qq说说备份导出工具_曾经比微信还火,3亿人用过的腾讯软件,如今彻底凉了...
  20. C++经典编程题目(九)玩火柴棍游戏

热门文章

  1. 【前端】过渡(transition)
  2. Java.SE01.多线程
  3. CentOS7修改时区的正确姿势
  4. 给惊云下载系统添加ewebeditor编辑器
  5. unity c 语言教程,程序丨Unity教程:如何用最简单的方式创建Simplex噪声?
  6. 加州伯克利大学的一些“前”规则
  7. BigDecimal保留两位小数
  8. Light and Matter-The theory of Physically-Based Rendering and Shading
  9. 图像增强及运算篇之图像掩膜直方图和HS直方图
  10. 操作系统 ucorelab1