由于网络集成,我是否应该编写自己的物理引擎?


11

我目前正在开发自上而下的实时僵尸射击游戏。我正在使用JBox2D作为我的物理引擎用Java编写此代码。我本周一直在编写网络代码,现在可以进行物理同步了​​。

我打算使用预测性客户端/权威服务器模型,只要服务器稍后批准,客户端就可以自由移动。这涉及到客户端向服务器发送包含运动数据的数据包,服务器计算延迟,并从较早的状态重新模拟环境。

我的问题是,我当前的物理引擎JBox2D(基本上是Box2D的端口)不支持回滚世界,而且显然不容易序列化世界数据。我有2个解决方案,可以修改/扩展当前的物理引擎,也可以编写自己的引擎。

编写我自己的物理引擎的原因-

  • 我可以删除不必要的功能。在自上而下的游戏中,我真的只需要碰撞机制和处理力。不涉及重力。
  • 我可以更好地理解代码,并且[最有可能]更容易实现回滚功能

扩展/修改JBox2D的原因

  • 编写我自己的物理引擎将是大量的工作,可能会很麻烦
  • JBox2D有一个广泛支持的社区,可以为我的开发人员提供帮助
  • JBox2D针对碰撞检测等方面进行了特定的优化,使其非常有用
  • 已经完成了一些工作,但是几乎没有共享代码

那您有什么意见。这是我的第一款游戏,我绝对不是专业的游戏开发商。如果有人可以提供一些指向该地区已经完成的工作的链接(最好使用JBox2D / Box2D / Java)。


还要注意,如果使用JBox2D,则将需要在strictfp所有地方使用,这将严重影响性能。否则,服务器和客户端可能无法获得完全相同的结果。我建议改用定点。
sam hocevar 2011年

Answers:


7

2D中的碰撞检测是如此简单,我不知道为什么您一开始就不愿意使用物理引擎。而且由于所有处理力都是直截了当的或弯曲的(不会掉落,改变对角线等),就我个人而言,您应该选择这种方法。自己制作很简单。碰撞:

解释了在2个矩形中可能发生的3种可能的碰撞:

  1. 边到边:非常简单,您得到一条边的轴线,再得到一条边的轴线,并确定它们是占据相同的空间还是足够靠近其的空间。
  2. 边缘到角落:如果您有旋转形状,这将是最常见的。幸运的是,它也很容易实现。
  3. 到角落:这种情况很少发生,甚至不值得实施。这样做的原因是,必须有两件事在同一精确轴上沿完全相反的方向向下移动,直到您的引擎最后计算的小数点为止。现在,如果一切都旋转45或90度,那么这个MAY(甚至可能还是没有)值得

编辑:正如所评论的,我对这个问题还不那么熟悉,因此不应就子弹/弹丸碰撞进行咨询。

当我在2D空间中处理子弹时,我使用了一种既可以直线又可以弯曲的路径,可以使用物理引擎(不是从头开始创建)并使用标准碰撞来抛射子弹。

在评论中了解有关从头开始构建此文件的信息。


编辑: * 相信我, *无论哪种方式,由于弹丸以及在任何给定时间屏幕上会出现多少弹丸,您都需要在游戏引擎中进行某种形式的航位推算。您绝对不想在给定位置每帧更新屏幕上的每个子弹。但这是使游戏变得不可抗拒的好方法:D!您应该只更新以下内容:

  • 抛射子
  • 被扔向的方向
  • 是否弯曲
    • 如果是这样,曲线的作用是什么
  • 它是什么弹丸(这说明了图形,效果,损坏以及所有情况)

现在,根据该数据更新引擎中的数据,而不是针对每个该死的弹丸更新服务器上的数据,并针对每个子弹发送数据包数据。(想象一下,即使屏幕上只有两挺机枪,这样做!耶稣!)


当然它相对容易实现,但是我也对碰撞检测的优化感兴趣,我不知道如何实现。
liamzebedee

如果按照说明进行操作,我所描述的方法实际上就不需要优化。可能唯一需要的优化是执行检查的时间以及实际更新冲突的频率。例如:实际上,仅在可能发生碰撞时才需要更新它们。
约书亚树篱,

扩展我上次所说的内容。例如,当角色最初移动时,您只需要检查建筑物是否发生碰撞。当您甚至看到不是您角色的单位时,您只需要检查单位碰撞即可。您只需要检查弹丸碰撞(即使在那时)就存在。在知道某物甚至触摸其他物体或接近它之后,您可以跳过任何形式的碰撞类型检测(是边到边还是边到边?等等)。否则,请整体跳过。
Joshua Hedges

当我在处理冲突的服务器端,除非我需要等来检测多个玩家的碰撞
liamzebedee

4
@MadPumpkin:您的过度自信严重影响了您的答案;您在谈论检测碰撞,但是您没有提到扫掠碰撞检测,它是2D射击游戏中正确处理子弹的绝对核心。同样,即使进行扫描,分辨率也与检测同样重要,因为您需要确定首先发生哪个冲突,解决潜在冲突,并在实体被删除的情况下重新开始整个分辨率。当然,您似乎暗示的不是琐碎的事情。
sam hocevar 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.