【问题标题】:Libgdx multiplayer data managementLibgdx 多人数据管理
【发布时间】:2014-04-17 08:07:34
【问题描述】:

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

  1. 只发送“我在射击”,服务器决定射击哪种子弹(取决于客户端当前的武器)
  2. 自行管理并再次将子弹的位置作为Vector2(以及子弹的类型)发送到服务器

万一

  1. 服务器需要更新所有的位置 子弹并管理它们的碰撞检测,然后发送 位置(和效果,如果子弹击中某人/某物)。

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

哪种方式更好,或者有更清洁的解决方案?

【问题讨论】:

    标签: java libgdx multiplayer


    【解决方案1】:

    在决定在客户端计算什么以及在服务器端计算什么时,需要考虑几个因素。很大程度上取决于游戏的类型以及如何处理延迟、丢包等。让我们假设客户端确定敌人的子弹何时与它相撞。这种方法的积极之处在于,只有当玩家的角色和玩家屏幕上的子弹碰撞时才会击中玩家。但是,由于滞后,对手可能会观察到子弹击中了另一名玩家,但在该玩家的屏幕上子弹未命中。这可能会让对手感到恼火,因为玩家似乎“坦克”了子弹击中。

    当服务器决定子弹何时击中时,事情并不完美。现在可能会发生这样的情况,在您的屏幕上,您似乎巧妙地躲过了一颗子弹,但在几分之一秒后您就死了,因为您在服务器上的位置与屏幕上的位置略有不同,并且服务器决定您被击中。就我个人而言,我更愿意接受其他玩家“坦克”,而不是我自己无缘无故地死去。

    当然,游戏速度会在很大程度上影响客户端和服务器之间的延迟对游戏玩法的影响。我想测试不同的可能性是确定哪些对您的游戏有效,哪些无效的唯一好方法。可以模拟不同的延迟量,并且可以补偿延迟(例如,谷歌延迟补偿)。

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

    当然,让客户端处理大部分逻辑的危险在于更容易为游戏创建作弊。然而,作弊通常只有在游戏获得一定人气后才会出现。因此,我最初不会担心作弊,而是专注于让游戏尽可能有趣。

    【讨论】:

    • 我真的不在乎作弊,因为我认为这个游戏永远不会被这么多人玩^^ 这只是为了获得一些编码经验。所以看起来,这个问题不容易解决,需要大量测试......非常感谢!
    • 我认为,如果我真的开始我计划的游戏(实际上我没有时间)我会选择“服务器计算一切”选项。游戏应该主要用于局域网,所以我希望不需要客户端插值,这样客户端就可以发送输入、接收更新和绘制所有内容,仅此而已。
    【解决方案2】:

    如果客户端处理所有逻辑,如冲突等,这很困难。一个问题是作弊,因为在这种情况下服务器无法检查任何内容并且必须信任客户端。另一个问题是同步。两个玩家的互联网连接可能很差,并且有半秒的延迟。他们在本地互相击中,但在另一个客户端上,他们不会被击中。同步您可能使用的 Box2D 非常困难。

    如果您的服务器处理所有事情并负责游戏世界,这可能会更容易。客户端只会将他们的“输入”发送到服务器,例如射击、奔跑、切换武器。服务器将所有状态信息发送给客户端,如位置、健康点等。然后客户端将只呈现这些信息。

    多人游戏从来都不是一件容易的事,你应该如何做主要取决于具体的游戏,所以一般来说很难做出任何陈述。这真的取决于你需要什么。例如,如果您认为您不需要任何作弊保护,客户可以做更多的工作。

    【讨论】:

    • 所以我只会发送“按下左键”或“按下射击”,然后服务器计算其余部分?这种方式听起来确实更好。所以客户甚至不需要使用 box2D 对吗?
    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多