我想从头开始构建一种小型(极小且简单)的MMORPG游戏,在给定网格内点击动作(类似于在线口袋妖怪游戏)。当我单击一个单元格时,玩家将移动到达指向区域(使用路径寻找算法,如A *)。但是,我不知道如何构建运动系统的网络协议。而且,谷歌搜索主题似乎并没有帮助我很多。我需要做出选择: - 每当我从一个小区移动到另一个小区时,我都会向服务器发送一条消息(这根本不是高效的,因为如果我们在一个100毫秒的延迟网络中,我只能感知10个移动/秒如果我要求服务器确认移动它只能做5moves / sec) - 每次玩家想要改变它的方向时我都会发送一条消息(它点击另一个小区)。客户端定期向服务器发送其位置,并检查它是否与目的地一致。
第二个解决方案看起来比第一个解决方案好很多,我认为真正的游戏系统必须实现该战略。我错了吗?
此外,我们如何构建基于该解决方案的系统,该解决方案不允许经过修改(被黑客入侵)的客户端能够发送假位置并在任何他们想要的地方传送?真正的系统是否实现了一些像#"不连贯的发送位置"试图尝试检测并修复这些问题的系统?
或者,是否有更简单的实施方法?非常感谢你
答案 0 :(得分:1)
在实时游戏中,我会创建一个喘息的机制。我会使用如下公式:Speed * time = distance。
现在如果你在客户端和服务器中运行相同的逻辑,你只需要在开始时发送移动逻辑,服务器可以在行进距离时用完成消息回答。 (最后比较以防止作弊。服务器总是赢)
现在,如果客户取消进入其他地方的运动,则会发送取消喘息和您旅行的时间。改变喘息时也是如此(在这种情况下,你会发送一条盯着新时间和地点的新路径)。
答案 1 :(得分:1)
感谢ScarletMerlin的回答,我认为这是解决我问题的简单方法。
当玩家想要从一个位置(例如0,0)移动到另一个位置(例如10,10)时,它会发送一个" MOVE 10 10"消息到服务器。
然后,只有服务器将应用路径寻找算法,并在每次移动位置后发送给客户端。 (例如,通过消息CURRENTLY_ON X Y)。然后,客户端将更新播放器的位置。
它是从服务器到客户端的一种自动同步。它还解决了第一种解决方案的问题(每次移动一次移动和一次ACK),这要归功于管道连接。例如,如果网络有1000毫秒的延迟并且移动设置为50毫秒,我们将在时间1000,1050,1100,1150接收消息......所以,我们只会感觉到玩家改变方向时的滞后。 当用户从一个方向转换到另一个方向时,用户也会感到有些滞后,但如果我们假设延迟非常低并且是对称的(它似乎不是一个过于强烈的假设),那么它就不会如此非常感知(因为改变方向通常在发送CURRENTLY_ON消息之前到达,并且服务器可以中断其当前操作(直接进行)以处理新的消息)。