如何在检测到接触/碰撞后纠正SKPhysicsBody的位置?

时间:2015-10-22 18:28:48

标签: ios swift sprite-kit

我正在用SpriteKit物理引擎编写2D游戏,其中光盘在棋盘上滑动(类似于空气曲棍球游戏,从上到下的角度来看)。大多数物理都可以使用SpriteKit的默认属性来处理,但是我认为我必须自己编写一个特定的案例。

在电路板中央有一个圆孔,光盘可能会落入其中。孔的尺寸仅略大于圆盘的尺寸。因此,如果光盘的中心足够缓慢地通过孔,则光盘应该被吸引到#34;到中心(因为它失去平衡进入洞)。此外,如果整个圆盘越过孔,它应该反弹到孔的边界,因为它完全落下。我还不完全确定如何为此编写物理,但我想我可以想出一些东西。我的问题是我应该在哪里编写代码以及我可以使用哪些信息。

About SpriteKit页面给出了SpriteKit在每个帧上执行的不同步骤。使用与孔中心的接触碰撞,我可以检测到光盘何时通过孔,因此当我需要增加力或校正光盘的运动时。但是,我不知道何时在SpriteKit循环中发生这种接触检测。如果它是在物理模拟之后和渲染场景之前会很好。

有没有办法编写一些代码,在SpriteKit计算出所有物理主体的新位置之后但在显示之前执行,同时可以访问每个主体的新位置和旧位置,类似于{{ 1}}在oldValue属性观察者中?如果没有简单的方法来获取身体的新旧位置,我想我必须在每次更新时将自己的旧位置存储为属性,但我宁愿避免这样做。

如果没有简单的方法来纠正"在渲染之前的物理模拟中,我应该在哪里编写模拟与中心孔相互作用的光盘物理的代码?

1 个答案:

答案 0 :(得分:0)

不应该有“最后的位置”或类似的东西。

你可以拉disc.physicsBody?.velocity,然后计算从那里开始的位置。您可以在updatedidSimulatePhysics中执行此操作。

因为你有一个中心孔,你可以设置一个小圆圈,即半径为一个物理体,你可以将hole.physicsBody?.collisionBitMask设置为0x0(0或者没有冲突)并且hole.physicsBody?.contactBitMask = 0x1(所有节点的默认值为0x0)以及disc.physicsBody?.contactBitMask = 0x1。这应该允许您检测联系人(不是碰撞,因为没有),并检查disc.physicsBody?.velocity是否小于某个值。