尝试在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


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

从文档中:

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

我做错什么了吗?

最佳答案

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

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

关于ios - 属于同一类别的SpriteKit/SKPhysicsradialGravityField总是相互吸引吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32740601/

10-11 08:43