SpriteKit/SKPhysics radialGravityField той же категории всегда привлекают друг друга?

Столкнувшись с проблемой, пытаясь использовать поля радиальной гравитации в 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, но, разумеется, их больше не привлекает и Звезда)! Я ожидаю от этих двух строк кода, что только гравитационные поля звезд будут влиять на планеты...

из документации:

"fieldBitMask: маска, определяющая, какие категории физических полей могут оказывать силы на это физическое тело. Когда физическое тело находится внутри области объекта SKFieldNode, свойство categoryBitMask этого узла поля сравнивается со свойством fieldBitMask этого физического тела путем выполнения логического Операция "И". Если результатом является ненулевое значение, эффект узла поля применяется к физическому телу ".

Я делаю что-то не так?

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

(Не уверен, что это правильный код Swift, но вы поняли идею). Вы можете расширить маски, всегда сдвигая влево на один шаг дальше. Эти маски всегда будут давать нулевое значение, если AND-ed.

Другие вопросы по тегам