物理
GameMaker 集成了专用的物理库,这意味着您现在可以控制游戏世界中对象物理行为的所有方面,尤其是碰撞和对象交互。"传统"碰撞系统(GameMaker 默认为该系统)是"被动"系统,您可以在其中检查碰撞,然后对碰撞做出反应,并将代码放入各个对象中。这对于简单的游戏来说是可以的,但当你拥有大量的对象,并且必须对它们如何对游戏世界中的不同情况做出反应进行编码时,很快就会发现,这个系统只是不够。那时你必须求助于 GameMaker 物理系统。
物理系统的工作方式与普通碰撞完全不同。它更像是一个"被动"的系统,在游戏世界中,在发生任何碰撞或交互之前,您会为您的对象定义一系列属性,以及游戏世界本身的属性。然后,这些代码化的"规则"将控制游戏世界中的一切相互作用的方式。通过这种方式,使用几个简单的代码和正确的房间设置,您可以在对象和世界之间创建非常复杂的交互并解决,而无需为每个可能的结果编码。
使用 GameMaker 物理世界时,应注意以下几点:
- GameMaker 的物理系统与基本房间和实例结构"分开",这意味着它的时间和函数不一定像其他任何东西那样与房间速度和步进顺序相关。
- 物理系统取代了许多正常的实例函数。。。。。。例如,不是为某个实例设置速度和方向,如果它已被声明为完全模拟的物理身体,您将使用力或脉冲使其在游戏世界中移动,或者如果它未启用物理函数,则需要自己设置 X 和 Y 位置。这需要一点时间来适应,所以在尝试将它们集成到项目中之前,先试验一下物理函数并了解一切是如何工作的。
- 您应该限制创建的实例数,以及物理世界必须处理的碰撞和碰撞组的数量。不能有成千上万的实例,所有这些实例都具有物理属性和碰撞,并且由于物理需要一些非常密集的计算,因此,请尽可能限制自己并进行优化。
- 在设置碰撞时,尽量使用父对象,因为碰撞系统有有限的碰撞位可以分配给 Box2D 的实例来检测碰撞。例如,如果你有五个不同的墙体对象,不要检查五个碰撞,而是创建一个父对象,并将其分配给五个墙体,然后让一个碰撞检查与父对象进行碰撞。对象的物理属性不会被继承,只有碰撞会被继承。通过这种方式,你可以保持游戏的优化和解决错误。
- 除了使用物理函数,尽量不要以任何方式将实例从房间的一个点移动到另一个点(即:不要手动设置 X/Y 坐标)。尽管可以这样做,而且在某些情况下可能是必要的,但由于它可能对物理引擎产生不可预测的结果,特别是在试图解决碰撞的时候,一般要避免这样做。
- 绑定装置时应该小心,因为它们可以独立地绑定到对象和实例上。这意味着,如果你将一个装置绑定到(例如) "o_Wall",该对象的所有实例都将获得该装置。如果你只想把装置绑定到一个实例上,那么在适当的函数中使用该实例的ID。
- 请注意,由于浮点精度的差异,您可能会发现不同目标平台的游戏版本可能会表现出与标准 Windows 版本微妙不同的行为,尽管每个版本在后续执行过程中都会保持自我一致。
- 为了防止物理模拟中的不稳定性,Box2D 对一个物体在一次更新中的旋转和平移量进行了上限限制。明显的限制将根据物理模拟的精度,按照物理世界的更新次数和更新速度,以及物理世界的缩放比例而变化。这意味着(例如)如果你有一个 60 的世界更新速度,最大的移动速度将是 20。
有关物理函数的信息,请参阅以下页面:
最后,有几个特殊的物理函数可能对更高级的物理模拟有用。第一个用于测试房间中特定点上的可能碰撞,第二个用于在实例中生成自定义质量和惯性属性: