相同类别的SpriteKit / SKPhysics radialGravityField总是互相吸引?

时间:2015-09-23 13:14:23

标签: ios swift sprite-kit skphysicsbody skfieldnode

遇到试图在SpriteKit中使用径向重力场的问题

我不想要同类型的对象(由categoryBitMask定义以吸引彼此)

以下是我的表现方式:

struct PhyscisCategory {
    static let None : UInt32 = 0
    static let All : UInt32 = UInt32.max
    static let Star : UInt32 = 0b1
    static let Planet : UInt32 = 0b10
}
<....>
 Planet1.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet1.physicsBody!.fieldBitMask = PhyscisCategory.Star

 Planet2.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet2.physicsBody!.fieldBitMask = PhyscisCategory.Star

无论我尝试什么行星总是相互吸引(除非我将fieldBitMask设置为0,但它们当然不再被Star吸引)!我期望这两行代码只有恒星重力场会对行星产生影响......

来自文档:

&#34; fieldBitMask: 一个掩码,用于定义哪些类别的物理场可以对此物理主体施加力。 当物理主体位于SKFieldNode对象的区域内时,通过执行逻辑AND操作将该字段节点的categoryBitMask属性与此物理主体的fieldBitMask属性进行比较。如果结果是非零值,则字段节点的效果将应用于物理主体。&#34;

我做错了吗?

1 个答案:

答案 0 :(得分:1)

你的面具出了问题。在二进制文件中,它们看起来像这样:

0000 0000 1011 0001 (stars)
0000 1011 0001 0000 (planets)

这两者中的逻辑AND产生非零值:

0000 0000 0001 0000

因此,如果SpriteKit使用另一个行星的类别位掩码评估您的星球的场掩码,它们将相互吸引。请尝试使用这些面具:

static let Star : uint32_t = 0x1 << 0
static let Planet : uint32_t = 0x1 << 1

(不确定这是否是有效的快速代码,但你明白了)。您可以通过始终左移一位来扩展掩码。如果是AND - ed。

,这些掩码将始终产生零值