关于ios:SpriteKit / SKPhysicsradialGravity同一类别的字段总是相互吸引吗?

SpriteKit/SKPhysics radialGravityField of same category always attracting each others?

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

我不希望使用相同种类的对象(按categoryBitMask的定义相互吸引)

这是我的操作方式:

1
2
3
4
5
6
7
8
9
10
11
12
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吸引)!我希望这两行代码只能使恒星重力场对行星产生影响...

来自文档:

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

我做错什么了吗?


您的口罩不合时宜。在二进制文件中,它们如下所示:

1
2
0000 0000 1011 0001 (stars)
0000 1011 0001 0000 (planets)

这两个的逻辑AND产生一个非零值:

1
0000 0000 0001 0000

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

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

(不确定这是否是有效的快速代码,但是您知道了)。您可以通过始终向左移一点来扩展遮罩。如果AND -ed,则这些掩码将始终产生零值。