2015-06-10 5 views
4

Я слышал, что в каждой игре Sprite Kit разрешено использовать только 32 разных билета категории. Есть ли способ обойти это? Мне нужно больше, чем тогда (примерно в 3-4 раза больше, так как игра - это открытый мир). Я настроил мои categorybitmask годов следующим образом:Какое максимальное количество разрешений категорииBitMask разрешено в комплекте Sprite?

static const uint64_t boundaryCategory = 0x1 << 0; 
static const uint64_t mainCharCategory = 0x1 << 1; 
... 
static const uint64_t someOtherCategory = 0x1 << 31; 

Я даже изменил uint32_t к uint64_t в надежде, что удвоит количество categorybitmask-х годов я мог бы использовать. К сожалению, нет. Если кто-нибудь знает какие-то методы, чтобы обойти этот предел, я буду очень благодарен.

+0

Вы правы. Поскольку Sprite Kit использует битовую маску для 32-битного целого, представляющую 32 разных физических категории, вы не можете иметь больше (это верно даже в Xcode 7). Для максимального значения (UInt32 * 2), 4294967295, которое равно 11111111111111111111111111111111 в двоичном формате, вы делаете этот объект сталкивающимся со всеми остальными. –

+0

Хорошо. Таким образом, нет абсолютно никакого способа взломать это ограничение? Может быть, есть какая-то другая техника, которую я могу использовать, которая даст ту же или аналогичную функциональность, что и «char1.physicsBody.categoryBitMask = char1Category?»? – Krekin

ответ

7

Существует несколько способов творческого подхода к этой проблеме. Например, вы можете использовать свойство name для узла. Попросите всех ваших врагов в одной категорииBitMask и используйте их имена, чтобы их разграничить, как только будет создан контакт.

Другой альтернативой является использование свойства словаря SKNode. Это позволяет хранить более подробные данные, если требуется, чем просто строка.

Создание словаря SKNode:

myNode.userData = [NSMutableDictionary dictionary]; 
[myNode.userData setObject:@"goblin" forKey:@"enemyType"]; 

Чтение словаря:

NSString *myString = [myNode.userData objectForKey:@"enemyType"]; 
+0

Блестящий! Почему я не подумал об этом? Спасибо. – Krekin

+0

Хорошо! Первый пример, касающийся свойства имени узла, работает блестяще! Так же "(firstBody.categoryBitMask == [_worldNode childNodeWithName: @" charRed "]. PhysicalBody.categoryBitMask) && (и т. Д.)". Однако, Сангони, не могли бы вы показать пример того, как сделать второй метод, в отношении свойства словаря SKNode? – Krekin

+2

@ Крекин - обновленный ответ. – sangony

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