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 этого физического тела посредством выполнение операции логического И. Если результатом является ненулевое значение, эффект узла поля применяется к физическому телу ".

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


person Xav    schedule 23.09.2015    source источник
comment
Что ж, проблема кажется глубже: я провел несколько дополнительных тестов, и fieldBitMask, похоже, полностью игнорируется, за исключением случаев, когда он установлен на 0 или все 1 .... (я нацелен на приложение ios 9 в xcode 7)   -  person Xav    schedule 25.09.2015
comment
Возможно, вы захотите использовать это как обходной путь. stackoverflow.com/a/31502698/2158465   -  person Epic Byte    schedule 25.09.2015
comment
Спасибо за совет ... Работаем нормально, переопределив гравитационное поле и проверку categoryBitMask и fieldBitMask ...   -  person Xav    schedule 30.09.2015


Ответы (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.

person Double M    schedule 08.10.2015
comment
нет, они в порядке ... :) 0b1 = ..0000001 0b10 = ..0000010 - person Xav; 09.10.2015
comment
Но каждая шестнадцатеричная цифра преобразуется в четыре двоичных цифры. 1 = 0001, b = 1011. Вы пробовали метод переключения? Я думаю, что один из нас что-то неправильно понимает. - person Double M; 09.10.2015
comment
это не шестнадцатеричная запись (0x ...), а быстрая двоичная запись (0b ....), это UINT32 (32 бита) 0b1 = 1 0b10 = 2 0b100 = 4 - person Xav; 09.10.2015
comment
Оооо, понятно. Тогда мое плохое :) Мне действительно стоит начать изучать Swift. - person Double M; 09.10.2015