iOS SpriteKit:对物理体施加applyForce的效果因设备型号而异

7

我和一个朋友正在使用SpriteKit进行一些原型设计。虽然这不是我朋友第一次使用它,但却是我第一次使用。

我们有一个简单的正方形控制器。你可以在“地面”节点上来回奔跑,并且你可以点击“跳跃”按钮进行跳跃。

通过给定一组质量、重力等数字,以下是预期的结果

[self.physicsBody applyForce:CGVectorMake(0, 1500000)];

在iPad4的iPhone模式下运行时,跳跃看起来正常(几乎是小兔跳),但在我的5S上,跳跃高度大约是20到40倍,在4S上,跳跃高度实际上是100或200倍(“倍数高”是基于目测的估计,但iPad看起来正常,5S看起来像超人跳跃,而4S则像超人吃了菠菜并在跳跃前和他的妻子发生了关系)。所有设备上运行的代码完全相同。我不确定应该从哪里入手或可能是什么原因导致这种情况。

1
哇,使用applyForce的数值非常高啊!你确定节点的质量和场景的重力每次都是一样的吗?你的场景中有使用任何SKFieldNodes吗? - sangony
没有SKFieldNodes,场景重力、节点质量等始终相同。没有任何设置来改变它们。只有一些SKLightNodes,一堆“地面块”SKSpriteNodes和“玩家”SKSpriteNode。还有一个相机。质量设置为80.0,重力为-9.8。如果您不将质量从默认值更改为小于0的某个小数,则力量会很大。将质量更改为较大的数字使您需要更大的力才能移动它:)。我更喜欢使用(相对)整数,因此质量和力量进行了调整。 - chadbag
如果你在模拟的每一步中都没有施加力,那么你就在错误地使用力。考虑到力非常大(除非你设置了非常高的质量),我认为这就是情况所在。如果你要瞬间施加力,那么你应该使用applyImpulses而不是forces。你还可以直接设置速度来检查是否得到相同的结果。 - Epic Byte
@sangony 实际上不应该会有这种情况。但是由于错误地使用了 apply force,并且 apply force 取决于物理模拟的步骤,设备上模拟的时间差异可能会导致这些差异。苹果文档指出:“加速度仅适用于单个模拟步骤(一个帧)。”由于力非常大,步骤的微小时间差异可能导致较大的差异。这只是猜测。我建议 OP 尝试使用冲量或直接设置速度来缩小问题的原因。 - Epic Byte
@EpicByte 在物理学中,力并不是“大”的,考虑到其他值。苹果文档指出,实际值并不重要,只要它们相对于彼此的比率保持不变即可。如果我正确地阅读了文档,您可以拥有10的质量和100的力,或者1的质量和10的力,如果使用一致的值,则会获得相同的效果。“Sprite Kit中的所有值都使用国际单位制(SI单位)指定。只要您的游戏使用一致的值,实际的力和质量值并不重要。” - chadbag
显示剩余11条评论
1个回答

8
如果您需要瞬间施加力,则应使用applyImpulse而不是applyForce。关于applyForce,苹果文档说明如下:“该加速度仅适用于单个模拟步骤(即一帧)。”。由于力量在仅1帧内非常大,因此步骤的极小时间差可能导致较大的差异。如果您正在使用applyForce,则应在模拟的每个步骤中执行它,以保持力量在一段时间内施加。通常,跳跃的运动时间非常短,因此经常使用applyImpulse。
以下是苹果文档中有关力和冲量的另一个引用:“根据应用力和处理模拟的下一帧之间经过的模拟时间量,将力作用于一定时间长度。因此,要对物体施加连续的力,您需要在每次处理新帧时进行适当的方法调用。力通常用于连续效果。冲量会瞬间改变物体速度,与已经过的模拟时间量无关。冲量通常用于立即改变物体速度。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接