如何防止Spritekit物理实体在碰撞过程中相交?

时间:2015-08-08 02:55:22

标签: xcode sprite-kit collision-detection intersection skphysicsbody

所以我有一个动态的矩形物理体(玩家)与地面相撞,它不是动态的,也是一个矩形。

每当两个人碰撞时,玩家的物理身体稍微穿过地面,然后反弹回来。我可以直观地看到这一点,并通过使用println()来记录每一帧中角色的Y位置:

117.405
107.206
96.3573
84.8607
72.7158
59.9225
46.4809
50.826   <-- Player's position dips down below surface of ground
52.3426
52.3685
52.3703
52.3704

对于两个物理实体,恢复原则设置为0.0。我甚至在一个空白项目中对此进行了测试,无论如何它似乎都会发生。

有没有更好的方法来检测这种碰撞,使用光线投射,矩形的交叉点,或者除了Spritekit奇异物理之外的其他一些自定义实现?

3 个答案:

答案 0 :(得分:1)

您是否尝试过调整SKPhysicsBody的速度?例如,您可以将y速度调整为永不超过更新循环中的最大值。或者,当发生接触时,降低速度(甚至可以降低到0)。

对于后一种建议,您应该使用位于主体下方的附加物理体作为传感器。传感器为SKNodeSKSpriteNode(在下图中),动态SKPhysicsBody不受重力影响并固定到父节点。身体不应该与任何东西碰撞,而只是通过其contactTestBitMask回应与其他物理身体的接触。它看起来像这样。

enter image description here

这可能不是马里奥的方式&#34;这样做,但它可能让你更接近感觉就像它的东西。

答案 1 :(得分:0)

不要放弃SpriteKit的物理引擎!首先,在物理实体上设置此属性:

yourPhysicsBody.usesPreciseCollisionDetection = YES;

请记住,当您尝试执行精确的高速碰撞时,这是有利的。 SpriteKit物理通常受Sprite Kit帧周期的限制,它会调用update,然后一遍又一遍地执行动作,然后是物理,然后绘制等。因此,如果你有一个非常快速的碰撞,那么它就没有足够的时间在某些帧内注册。另一方面,通过精确碰撞,您可以使用SpriteKit算法来测试多个移动位置以精确定位接触。

如果失败,您可以在发生碰撞之前将薄物理主体附加到接触部位(如果您知道节点将以高速碰撞)。这将充当缓冲区以在它们之间创建空间。

答案 2 :(得分:0)

不确定这是否构成答案本身,但我决定为平台游戏实现我自己的物理。

对于任何可能面临类似问题的人,我建议你也这样做。在我的其他一个游戏Piston Flip中,我使用了Spritekit物理,因为游戏包含了物理体的一些变体,我从来不需要完全重新创建两次相同的物理交互。因此,如果您正在制作需要更复杂物理的东西并且您不需要精确复制,那么请使用spritekit physics。

现在,如果您需要像平台游戏那样的精确度,我建议您自己实施。我使用this tutorial作为起点并从那里进行定制。抛开令人恼火的初步实施,我现在非常高兴能够如此准确地控制一切。