在 Sprite Kit 中为碰撞执行您自己的物理计算
Posted
技术标签:
【中文标题】在 Sprite Kit 中为碰撞执行您自己的物理计算【英文标题】:Performing your own physics calculations for a collision in Sprite Kit 【发布时间】:2014-02-20 03:39:47 【问题描述】:我正在尝试使用 Sprite Kit 设置一些弹性碰撞。正如我在Sprite Kit Physics Collision Issue 中询问的那样,多个对象彼此靠近的情况存在问题@
我对发生碰撞的时机感到困惑。
我尝试在-didBeginContact:
委托方法中将dynamic
设置为NO
,计算最终速度,然后在-didEndContact:
中将dynamic
设置为YES
,然后正确设置速度。
我希望它在碰撞之外是动态的原因是因为我希望摩擦/重力等可用。顺序/逻辑有什么问题?我查看了-didSimulatePhysics
方法,但它似乎不是要走的路。
【问题讨论】:
你是如何应用你正在计算的速度/力量的? 我在做“setVelocity” collision 有一个浮动属性 (collision.collisionImpulse),可以告知您影响的严重程度。 SKPhysicsPins 可以具有弹性属性。我可以建议从 GitHub 下载 Matti Räty 的 MRRopes 示例并使用该示例的属性吗? 你能不能把你的代码给我们看清楚。可能是物理理论问题,而不是精灵套件问题。 我不太了解您想要做什么,但也许您想删除动画师的一些行为并使用新设置再次添加它们? (改变项目相互碰撞时的摩擦行为......)使用 animator.removeBehavior(frictionBehavior) 很容易做到 【参考方案1】:使用 applyImpulse 代替 setVelocity。您想使用脉冲或力来确保物理引擎可以正常预热。对于非常接近或重叠的对象,使用 setVelocity 会产生不可预知的结果。
确保对象之间有一定距离并且它们不重叠。
正确设置冲突位掩码。
这应该都能完美运行。
【讨论】:
【参考方案2】:我正在尝试使用 Sprite Kit 设置一些弹性碰撞
我认为你误解了这里的物理原理。弹性碰撞是对碰撞的过度简化。实际上,没有碰撞会导致完美的能量转移。我在回答您链接到的相关问题时解释了物理here。
我怀疑通读一遍你会发现可以在 SpriteKit 中完成“弹性”碰撞,但大多数人没有意识到你需要在对象之间留出空间。您不需要自己进行物理计算。
【讨论】:
【参考方案3】:我不确定这是否正是您想要做的,但如果我想在没有 SpriteKit 帮助的情况下计算碰撞结果,同时将所有其他物理特性留给 SpriteKit,我会执行以下操作:
-
将
dynamic
属性始终设置为YES
。
为每种对象设置categoryBitMask
属性。
将对象的collisionBitMask
属性设置为要保留自动碰撞计算(例如,墙壁,但不是其他对象)的所有 categoryBitMask 的分离,或者如果要处理 所有手动碰撞。
将对象的contactTestBitMask
属性设置为您想要手动计算碰撞的任何对象。
在didBeginContact
中计算并设置所有结果速度。
(简而言之,将您的对象从它们自己的collisionBitMask
中排除。)
此链接可能会有所帮助:Working with Collisions and Contacts
【讨论】:
以上是关于在 Sprite Kit 中为碰撞执行您自己的物理计算的主要内容,如果未能解决你的问题,请参考以下文章