Libgdx多人数据管理

时间:2014-04-17 08:07:35

标签: java libgdx multiplayer

我想与Libgdx一起制作多人游戏 现在我只想问哪种数据应该处理服务器以及哪种数据应该处理客户端 基本上游戏应该是2D平台射击游戏,你可以在其中创建自己的关卡/地图。所以我认为地图文件应放在服务器文件中,并在连接时发送到客户端。这是对的吗? 后来我认为每个客户端都应该处理自己的移动(包括碰撞检测)并将当前位置(如Vector2)发送到服务器。问题是:它应该如何运作? 还有一件事:
如果客户拍摄,他应该:

  1. 只发送“我正在拍摄”并且服务器决定拍摄哪种子弹(取决于客户当前的武器)
  2. 自己管理并再次将子弹的位置Vector2(以及子弹的类型)发送到服务器
  3. 以防

    1. 服务器需要更新所有位置 子弹和管理他们的碰撞检测,然后发送 职位(和影响,如果子弹击中某人/某事)给两个客户。

    2. 客户端将处理与墙壁和他自己的碰撞,并将数据发送到服务器,这是 会把它发送给其他客户。然后另一个客户端需要检查与此子弹的冲突。因此,两个客户都需要检查与子弹的碰撞+一个客户检查子弹 - 墙碰撞。

    3. 哪种方式更好还是有更清洁的解决方案?

2 个答案:

答案 0 :(得分:2)

在决定在客户端计算什么以及在服务器端计算什么时,需要考虑几个因素。很大程度上取决于游戏的类型以及如何处理滞后,数据包丢失等。让我们假设客户确定敌人的子弹何时与其发生碰撞。这种方法的积极之处在于,只有当玩家的角色和子弹在玩家的屏幕上发生碰撞时才会击中玩家。然而,由于滞后,对手可能会发现子弹击中了另一名玩家,但是在该玩家的屏幕上,子弹未命中。这对于对手来说可能很烦人,因为玩家看起来像是坦克"子弹击中了。

当服务器决定子弹何时命中时,事情并不完美。现在它可能发生在你的屏幕上似乎你巧妙地躲过了一颗子弹,但是在你服务器上的位置与屏幕上的位置略有不同并且服务器决定你被击中后,你死了一小会儿。就我个人而言,我对其他玩家更好。"坦克"比我自己死的没有明显的理由。

当然,游戏速度会影响客户端和服务器之间的延迟对游戏的影响程度。我想测试不同的可能性是确定哪些适合您的游戏以及什么不适用的唯一好方法。可以模拟不同的滞后量,并且可以补偿滞后(例如,谷歌滞后补偿)。

另外需要注意的是,如果服务器处理所有计算(位置等),则可能导致游戏对象的抖动或延迟移动。例如,如果某些位置更新数据包丢失或延迟,如果不允许客户端插入对象的位置,则游戏对象可能看起来从一个地方跳到另一个地方。因此,客户至少应该能够在本地处理玩家的位置更新。否则,在使用控件和在屏幕上看到效果之间会有延迟。当然,如果游戏玩法很慢或所有玩家都在同一局域网上,这可能不是问题。

当然,允许客户处理大部分逻辑的危险在于,为游戏创建作弊更容易。然而,作弊通常在游戏获得一些人气后才开始出现。因此,我最初不会担心作弊,而是集中精力让游戏玩得尽可能有趣。

答案 1 :(得分:1)

如果客户端处理碰撞等所有逻辑,那将很困难。一个问题是作弊,因为在这种情况下服务器无法检查任何内容并且必须信任客户端。另一个问题是同步。两名球员的互联网连接不良,延迟时间为半秒。他们在当地互相攻击,但在另一个客户端,他们不会受到打击。同步你可能使用的Box2D非常困难。

如果你的服务器处理所有事情并且对游戏世界负责,那可能会更容易。客户只会发送他们的"输入"到服务器,像射击,运行,切换武器。服务器将所有状态信息发送给客户端,如职位,健康点等。客户端只会呈现这些信息。

多人游戏绝非易事,你应该如何做事主要取决于特定游戏,因此一般来说制作任何声明并不容易。这真的取决于你需要什么。如果你认为你不需要任何作弊保护,那么客户可以做更多的工作。

相关问题