在Sprite Kit中执行你自己的物理计算
我试图使用Sprite Kit来设置一些弹性碰撞。 在Sprite Kit物理碰撞问题中我问到了多个物体彼此靠近的情况
我很困惑碰撞的时机。
我试图在-didBeginContact:
delegate方法中设置dynamic
为NO
,计算最终速度,然后在-didEndContact:
将dynamic
设置为YES
,然后正确设置速度。
我希望它在碰撞之外是dynamic的原因是因为我想要摩擦/重力等等。 订单/逻辑有什么问题? 我看着-didSimulatePhysics
方法,但它似乎不是要走的路。
我试图使用Sprite Kit来设置一些弹性碰撞
我认为你在这里误解了物理学。 弹性碰撞是碰撞的过分简单化。 实际上,没有碰撞导致能量的完美传递。 我在这里解释了这个物理的一个答案,你所连接的相关问题。
我怀疑通过阅读,你会看到一个“弹性”的碰撞可以在SpriteKit中完成,但大多数人没有意识到你需要在对象之间的空间。 你不需要做自己的物理计算。
我不确定这是否正是你想要做的,但是如果我想在没有SpriteKit帮助的情况下计算碰撞结果,同时将所有其他物理体都留给SpriteKit,我会执行以下操作:
- 保持
dynamic
属性始终设置为YES
。 - 为每种对象设置
categoryBitMask
属性。 - 将对象的
collisionBitMask
属性设置为要为其保留自动碰撞计算的所有categoryBitMasks(例如,墙壁,而不是其他对象)的分离,或者如果要手动处理所有冲突,请将其设置为零。 - 将对象的
contactTestBitMask
属性设置为您要手动计算碰撞的任何对象。 - 计算并设置
didBeginContact
所有速度。
(简而言之,排除你自己collisionBitMask
物体的距离)。
此链接可能会有帮助: 使用碰撞和联系人
-
使用applyImpulse代替setVelocity。 你想要使用冲动或力量,以确保物理引擎可以正常预热。 使用setVelocity对于非常接近或重叠的对象将产生不可预知的结果。
-
确保物体之间有一定的距离,并且它们不重叠。
-
正确设置冲突位掩码。
这应该都是完美的。