如果两个 SKSpritenode 都设置了 SKPhysicsBody,我如何将它们放置在彼此之上?

How can I position two SKSpritenodes on top of each other, if they both have an SKPhysicsBody set?

我正在以初学者的水平开发一款简单的游戏。我有插槽,每个插槽有五个球。

想法是球进入插槽,是的,球的 zPosition 比插槽高一个。但它们都是children下方隐形插槽支架

如果插槽或球都没有设置 physicsBody,则球适合插槽。但是,如果我给它们一个 physicsBody,它们就会互相推开。

所以显然我还有一些物理知识 属性 我不明白。如果有人能给我指明方向?

你在这两个物体之间启用了碰撞。

碰撞由物理引擎处理,当两个物体相互弹开时会发生碰撞。设置为碰撞的物体不能占据相同的 space。将 2 个节点放置在彼此之上,当它们设置为碰撞时,它们将被推开直到不再碰撞。

联系人是当您希望在两个实体进行联系时通知您的代码。物体可以设置接触但不碰撞,碰撞但不接触,碰撞注册接触或两者都不注册。此外,一个物体可以与第二个物体碰撞而第二个物体不会与第一个物体碰撞(第二个物体的运动不会受到碰撞的影响,而第一个物体可能会飞走)。

如果您在创建 Sprite Kit 环境时什么都不做,所有物体之间都会启用碰撞(所有物体都会反弹)并且不会为任何物体启用接触(物体接触时永远不会调用您的代码),所以在设置通常必须关闭关闭某些碰撞并打开打开某些接触。

可以使用以下方法关闭物体之间的碰撞(保持现有碰撞不变):

nodeA.physicsBody?.collisionBitMask &= ~nodeB.category

我们将节点 A 的冲突位掩码与节点 B 的类别位掩码的逆运算(逻辑非,~ 运算符)逻辑与 'turn off' 该位节点 A 的位掩码。例如阻止红色圆圈与 'slot':

相撞
redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~slotCategory

可以缩短为:

redCircle.physicsBody?.collisionBitMask &= ~slotCategory

这假定 redCircle 和 slotCategory 是您用于节点和类别位掩码的名称。

这将阻止红圈从 'bouncing off' 一个槽位,但不会阻止 'slot' 从红圈弹回,因此您可能还需要:

slotX.physicsBody?.collisionBitMask &= ~circleCategory

对于每个插槽并假设每个圆圈都属于同一类别。

更多信息在这里:

我的 step-by-step 碰撞和接触指南:

以及碰撞和接触测试位掩码指南:

操纵位掩码以关闭和打开单个碰撞 ans 接触。