假设我们要监视节点A和节点B之间的联系,即使我们仅在其中一个节点上设置didBeginContact
,contactTestBitMask
似乎也会正确触发。换句话说,这段代码似乎工作正常:
nodeA.physicsBody?.categoryBitMask = NodeACategory
nodeB.physicsBody?.categoryBitMask = NodeBCategory
nodeB.physicsBody?.contactTestBitMask = NodeACategory
在节点A上设置contactTestBitMask是否有优势?代码更简洁,只为一个对象设置掩码,但是有缺点我们可以忽略吗?
答案 0 :(得分:2)
没有。在某些情况下,如果联系对象A而不是对象B,则只需要通知您。因此可以选择为每个对象设置contactBitMask。
答案 1 :(得分:2)
它似乎没有任何区别。
来自Apple的文档:
当两个物体共享相同的空间时,每个物体的类别掩码都是 通过执行逻辑来测试另一个身体的接触面罩 和操作。如果任一比较结果为非零值,则为 创建SKPhysicsContact对象并将其传递给物理世界 代表。为获得最佳性能,仅在触点掩码中设置位 您感兴趣的互动。
如果nodeB没有联系nodeA,nodeA似乎无法联系nodeB。所以nodeA联系nodeB; nodeB联系nodeA和节点A& B彼此接触都被认为是完全相同的,并且包含nodeA和nodeB的SKPhysicsContact
对象将被传递给didBeginContact
。
请注意,这与collisionBitMask
非常不同,其中nodeA可以与nodeB冲突并受其影响,但nodeB可以完全不受影响。