2015-09-23 11 views
0

Запуск в проблему пытаются использовать радиальные гравитационные поля в SpriteKitSpriteKit/SKPhysics radialGravityField той же категории всегда привлекает друг друга?

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

Я делаю что-то неправильно?

+0

Проблема с проблемой кажется более глубокой: я сделал несколько дополнительных тестов, и fieldBitMask кажется полностью проигнорированным, за исключением случаев, когда он установлен в 0 или все 1 .... (я нацелен на приложение ios 9 в xcode 7) – Xav

+0

Может захотеть использовать это как обходной путь. http://stackoverflow.com/a/31502698/2158465 –

+0

Спасибо за советы ... Работая отлично, переопределяя гравитационное поле и категориюBitMask & fieldBitMask check ... – Xav

ответ

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.

+0

нет, они в порядке ... :) 0b1 = .. 0000001 0b10 = ..0000010 – Xav

+0

Но каждая шестнадцатеричная цифра преобразуется в четыре двоичных цифры. 1 = 0001, b = 1011. Пробовали ли вы метод сдвига? Я думаю, что один из нас получает что-то неправильно. –

+1

это не шестнадцатеричная нотация (0x ...), а быстрая двоичная нотация (0b ....) они UINT32 (32 бит) 0b1 = 1 0b10 = 2 0b100 = 4 – Xav

Смежные вопросы