我正在用SpriteKit物理引擎编写2D游戏,其中光盘在棋盘上滑动(类似于空气曲棍球游戏,从上到下的角度来看)。大多数物理都可以使用SpriteKit的默认属性来处理,但是我认为我必须自己编写一个特定的案例。
在电路板中央有一个圆孔,光盘可能会落入其中。孔的尺寸仅略大于圆盘的尺寸。因此,如果光盘的中心足够缓慢地通过孔,则光盘应该被吸引到#34;到中心(因为它失去平衡进入洞)。此外,如果整个圆盘越过孔,它应该反弹到孔的边界,因为它完全落下。我还不完全确定如何为此编写物理,但我想我可以想出一些东西。我的问题是我应该在哪里编写代码以及我可以使用哪些信息。
About SpriteKit页面给出了SpriteKit在每个帧上执行的不同步骤。使用与孔中心的接触碰撞,我可以检测到光盘何时通过孔,因此当我需要增加力或校正光盘的运动时。但是,我不知道何时在SpriteKit循环中发生这种接触检测。如果它是在物理模拟之后和渲染场景之前会很好。
有没有办法编写一些代码,在SpriteKit计算出所有物理主体的新位置之后但在显示之前执行,同时可以访问每个主体的新位置和旧位置,类似于{{ 1}}在oldValue
属性观察者中?如果没有简单的方法来获取身体的新旧位置,我想我必须在每次更新时将自己的旧位置存储为属性,但我宁愿避免这样做。
如果没有简单的方法来纠正"在渲染之前的物理模拟中,我应该在哪里编写模拟与中心孔相互作用的光盘物理的代码?
答案 0 :(得分:0)
不应该有“最后的位置”或类似的东西。
你可以拉disc.physicsBody?.velocity
,然后计算从那里开始的位置。您可以在update
或didSimulatePhysics
中执行此操作。
因为你有一个中心孔,你可以设置一个小圆圈,即半径为一个物理体,你可以将hole.physicsBody?.collisionBitMask
设置为0x0
(0或者没有冲突)并且hole.physicsBody?.contactBitMask = 0x1
(所有节点的默认值为0x0
)以及disc.physicsBody?.contactBitMask = 0x1
。这应该允许您检测联系人(不是碰撞,因为没有),并检查disc.physicsBody?.velocity
是否小于某个值。