0

尝试在 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 吸引)!我希望这 2 行代码只有恒星重力场才会对行星产生影响......

从文档:

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

我做错什么了吗?

4

1 回答 1

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,这些掩码将始终产生零值。

于 2015-10-08T15:00:14.050 回答