热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AS3多人游戏开发—同步人物移动

在实时性要求比较高的多人游戏中,我们将面临不同客户端间的同步问题,而其中人物移动的同步是最常需要考虑的。这篇文章将描述作者对这个问题的一些思考和解决方案(基于ActionScript3)。

在实时性要求比较高的多人游戏中,我们将面临不同客户端间的同步问题,而其中人物移动的同步是最常需要考虑的。这篇文章将描述作者对这个问题的一些思考和解决方案(基于ActionScript3)。

  大多数RPG游戏中,人物的移动是由鼠标点击激发的,本文将着重探讨这种移动方式,关于鼠标控制移动的同步,我们以后的文章将会涉及。

  最简单的方式是你不断广播自己的当前位置,其他玩家收到数据的时候将对应的人物放到那个位置上去,然而这样却会造成其他玩家电脑上人物移动不平滑,因为他们总要等到位置数据后才能更新显示。你可以通过提高发送频率来减少这种不平滑的感觉,但这会增加了带宽的消耗。

  现在说下我自己使用的方法,这也是目前最常用的解决人物移动同步的方式。

  当我点击鼠标,人物开始移动的时候,我会发送以下数据给服务器,让其广播给其他玩家

?
//
avatar movement start time
public  var  startTime: Number
//
avatar's destination
public  var  endPoint:Point  
//
avatar's current position
public  var  currentPoint:Point
//
avatar's speed
public  var  spd: Number

  我们会发送人物开始移动的时间,人物的目的地坐标,人物的当前位置坐标,以及人物的速度(如果速度是不变的,就没有必要每次都发送)。我们现在来看看其他玩家的电脑如何通过这些数据来同步人物的移动的。

  玩家1控制着他的人物avatar1,玩家2电脑上有avatar2,它是avatar1在玩家2电脑上的模拟。玩家1点击了鼠标,他的人物avatar1开始移动,同时这些数据被发送出去,玩家1收到了数据,他可以通过自己的时间减去数据包中的startTime,得到当avatar1开始移动后经过的时间间隔passedTime(请注意这里的时间都是指服务器时间,而不是玩家自己电脑上的时间,不同的客户端必须要用统一的时间标准-服务器时间,这是同步的基础。关于客户端如何同步服务器时间,我们以后的文章会详解)。然后通过数据包中的spd,currentPoint和endPoint,获得avatar1到达目的地的时间endTime。实际上,我们目前只有endTime-passedTime的时间来移动玩家2电脑上的avatar2。要想让avatar2和avatar1同时到达目的地,我们可以提高avatar2的移动速度。这种做法确实可以让avatar1和avatar2在停止运动的时候处于同一位置,但是在运动过程中,他们的位置无法同步,因为avatar2总是在追赶avatar1,虽然他们的距离越来越小。

  我们还可以用更优雅的方式来同步他们的移动,那就是在最开始,avatar2使用一个更高的速度,然后在某一个时间点追上avatar1,然后再和avatar1以同样的速度移动,最后到达终点。时间点的选择权在你自己手中,时间点越靠前,你的同步越早,但是最开始的速度也最大,会影响用户体验。反之同步的时间越晚,但速度变化不明显,移动更平滑。

  原理就是这样,在AS3环境中,我们必须摒弃基于帧速的移动,因为不同性能的电脑将会有不同的帧速,让你产生不同的移动速度。要解决这个问题,我们可以使用getTimer()这样的代码来创建自己的基于时间运动的程序。这并不复杂,原理就是在每一帧中判断经过了多少时间,然后通过时间和速度计算应该达到的位置。对于我们的avatar2,它的运动分为了两个阶段,第一个阶段的速度比avatar1快,第二个阶段是的速度和avatar1一样。这两个都是直线匀速运动,所以代码编写很容易。当你实现了这个功能后,如果你有足够的勇气,可以尝试使第一阶段先加速,再减速,在时间点的时候正好达到和avatar1同样的速度。这将使两个阶段的衔接更平滑,带来更好的用户体验。

  在你自己尝试的过程中,专门配备一台服务器供你测试是很奢侈的,我们可以很简单的在客户端自己模拟网络延迟。我是这样做的,我在自己的代码中同时创建了avatar1和avatar2,每次我操作avatar1的时候,会延迟给avatar2赋值(模拟广播数据),这很不错,因为你可以随意改动延迟的时间。当你看到avatar2很执着的追赶上avatar1,然后他们并肩前行并一齐到达终点的时候,你会觉得努力没有白费。

     下次我将尝试使用键盘控制avatar1,看看这种控制方式会给我们的同步带来哪些改变。

  

   下面是我完成的demo,请点击flash屏幕进行测试,红色表示avatar1,绿色表示avatar2。

  


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 前端图片合成技术_靠谱的前端需要做哪些准备?
    Web前端开发源于传统的互联网,互联网普及让人才需求量居高不下,随着移动互联网的高速发展,移动终端的前端开发也越来越受到重视, ... [详细]
  • Flex根据后台的数据自动生成AdvancedDataGrid
    在企业级应用开发中AdvancedDataGrid和DataGrid使用的非常广。当然最基本的也是最常用的就是数据的直接绑定,固定列头和固定数据的列数。而这往往不能满足需求,企业应用 ... [详细]
  • 必要的时候我们需要将过长的字符串截短为较短长度,比如最多显示4个中文字,多余4个字只显示4个字(英文则应该是8个字母)等情况。直接上函数:functiongetCh ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一、什么是RabbitMQRabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:P ... [详细]
  • Go 再次成为 TIOBE 年度编程语言,可喜可贺
    Go再次成为TIOBE年度编程语言,可喜可贺 ... [详细]
author-avatar
驰诗勋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有