首页 > 解决方案 > SpriteKit 避免两个节点之间的碰撞

问题描述

期望的行为

在此处输入图像描述

问题

节点和关节设置良好(见左图),但它们physicsBody确实相互交互(右图):

在此处输入图像描述

请注意:为了获得正确的关节,我必须将一个子节点(圆圈)添加到红色形状(玩家手臂)。所以我们在这里总共讨论三个节点。

最近的尝试

尝试了一堆东西。在Apples 的文档这个线程之后,我了解到这可以通过正确组合categoryBitMask和来解决collisionBitMask

位掩码:

struct Category {
    static let none: UInt32 = 0
    static let all: UInt32 = UInt32.max
    static let playerBody: UInt32 = 0b1 // 1
    static let playerArm: UInt32 = 0b10 // 2
    static let regularObject: UInt32 = 0b100 // 4
}

蓝色形状:

body.categoryBitMask = Category.playerBody
body.collisionBitMask = Category.all

红色形状(以及它的关节子节点):

body.categoryBitMask = Category.playerArm
body.collisionBitMask = Category.none

...但这并没有解决问题。

现在连续三天挣扎。我知道这类问题已经被问了很多次,但没有一个能引导我走向正确的方向。非常感谢任何建议!

标签: swiftsprite-kitskspritenodeskphysicsbodyskscene

解决方案


这来自 Apple 文档:collisionBitMask(但对于 Scenekit,可能在 Spritekit 中是一样的)

该键的值是一个包含 NSUInteger 值的 NSNumber 对象。SceneKit 仅测试其 categoryBitMask 属性与此位掩码重叠的物理实体的接触。默认值为 all,指定搜索应测试所有物理实体 ,而不管其类别如何

所以你不应该使用 Category.all


推荐阅读