SpriteKit - 使用Physics / Velocity在一个Frame中移动Object精确距离

时间:2014-09-10 08:32:46

标签: objective-c sprite-kit

我正在为定制的Touchengine制作一种AirHockey游戏。

我的问题是精确位置更新和物理引擎的结合。

示例:每一帧我都能获得触摸的位置。让我们说在最后一帧是(100,100),现在是(200,100)。现在我想要一个带有PhysicsBody的SKNode,它在一帧内从(100,100)移动到(200,100)。

将速度设置为(100,0)不起作用,因为它以不同的方式移动。 SKActions不适用任何部队。设置位置也行不通......

有什么想法吗?

edit1:我试图将物理对象约束到我刚才移动的节点。不行。约束似乎只是重置位置,没有物理。 我还尝试将物理学固定到另一个节点,仅在物理学移动时适用...

2 个答案:

答案 0 :(得分:2)

我对物理引擎知之甚少,但我相信LearnCocos2D而不是寻找任何进一步的精确解决方案,但我找到了一个适合我的解决方案:

我使用SpriteKit循环的不同步骤:

<强> - (无效)更新
- 首先:我使用新的触摸位置来计算新旧位置之间的运动矢量
-second:我将矢量乘以某个因子(在我的情况下为15),以在一帧中得到几乎相同的距离
-third:将对象速度设置为该向量

<强> - (无效)didSimulatePhysics
(对象现在几乎在我的愿望位置)
为确保物体真正贴合触摸,请将物体的位置精确设置到触摸位置。

我知道,这不是100%,有时会有小的重叠,因为物体的位置并不完全是物理引擎中的位置,但是它的效果还不错。也许因素15可以动态调整,以确保更好的行为,但我不需要它,所以我不使用时间。 (如果有人知道更好的解决方案,我会很高兴听到

答案 1 :(得分:0)

在Box2D中,可以很好地在所需的方向上施加力,然后,一旦身体到达位置,对身体施加增长的阻尼,直到速度为0,这样效果不会感觉不自然。一旦物体接近目的地,你就可以开始应用阻尼,但是如果你决定改变身体或世界的物理属性,它就会非常不稳定。

就我而言,您可以通过velocity的{​​{1}}和linearDamping属性在SpriteKit中执行相同操作。

如果阻尼不起作用,你也可以使用反向力。

我没有任何SpriteKit示例,但如果有帮助我可以在Box2d中提供一个......

再次编辑以添加此样本。应该测试它如何与另一个身体相互作用并调整一些值以获得所需的效果。

SKPhysicsBody