您在这 2 个物体之间启用了碰撞。
碰撞由物理引擎处理,当两个物体相互反弹时发生碰撞。设置为碰撞的物体不能占据相同的空间。当它们被设置为碰撞时,将 2 个节点放在彼此的顶部,它们将被推开,直到不再碰撞。
联系是指您希望在 2 个机构联系时通知您的代码。实体可以设置为接触但不碰撞、碰撞但不接触、碰撞和注册接触或两者都不接触。此外,一个物体可以与第二个物体发生碰撞,而第二个物体不会与第一个物体发生碰撞(第二个物体的运动不会受到碰撞的影响,而第一个物体可能会飞走)。
如果您在创建 Sprite Kit 环境时什么都不做,所有物体之间的碰撞都会启用(所有物体都会从物体上反弹)并且任何物体都不会启用接触(物体接触时您的代码将永远不会被调用),因此在设置期间通常必须关闭 某些碰撞并打开 on 某些接触。
可以使用以下方法关闭物体之间的碰撞(保持现有碰撞不变):
nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
我们将 nodeA 的冲突位掩码与 nodeB 的类别位掩码的逆(逻辑非,~ 运算符)逻辑与,以“关闭”该位 nodeA 的位掩码。例如阻止红色圆圈与“插槽”碰撞:
redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~slotCategory
可以简写为:
redCircle.physicsBody?.collisionBitMask &= ~slotCategory
这假定 redCircle 和 slotCategory 是您用于节点和类别位掩码的名称。
这将阻止红色圆圈“反弹”插槽,但不会阻止“插槽”从红色圆圈反弹,因此您可能还需要:
slotX.physicsBody?.collisionBitMask &= ~circleCategory
对于每个位置并假设每个圈子共享相同的类别。
更多信息在这里:
我的碰撞和接触分步指南:
https://stackoverflow.com/a/51041474/1430420
以及碰撞和接触测试位掩码指南:
https://stackoverflow.com/a/40596890/1430420
操作位掩码以关闭和打开单独的碰撞和接触。
https://stackoverflow.com/a/46495864/1430420