2016-11-14 20 views

ответ

4

Битовая маска категории сообщает Sprite-Kit, какой это объект. Маска бит столкновений сообщает Sprite Kit, с какими объектами сталкивается этот объект (т. Е. Будет ударяться и отскакивать). Битовая маска ContactTest сообщает Sprite-Kit, какие контакты вы хотите получать извещения о том, когда этот объект касается другого объекта.

Коллизии обрабатываются автоматически игровым движком Sprite-Kit; контакты обрабатываются вашим кодом - когда происходит контакт, который вас интересует, вызывается код (didBeginContact' для Swift 2, 'didBegin(contact:) для Swift 3).

Вы должны думать об этом в двоичном формате и для простоты, мы начнем с простых разрядных масок категории, при этом каждый объект в вашей сцене относится только к одной категории.

E.g. на вашей сцене у вас есть игрок, игрок-ракета, враг и край экрана. Мы предположим, что бит-маски являются 8-битными, а не 32-битными. Подумайте каждое число в диапазоне от 8 цифр (8 бит), каждый из которых является 0 или 1.

Объектов в сцене должны иметь уникальные категории, поэтому мы выделим их следующий образом:

player.categoryBitMask  = 00000001 (1 in decimal) 
playerMissile.categoryBitMask = 00000010 (2 in decimal) 
enemy.categoryBitMask   = 00000100 (4 in decimal) 
screenEdge.categoryBitMask = 00001000 (8 in decimal) 

Если вы используете числа, которые в десятичном значении имеют значение, отличное от мощности 2 (1, 2, 4, 8, 16, 32, 65, 128 и т. Д.), Тогда в категории будет установлено более 1 бит битной маской, которая усложняет ситуацию (это означает, что этот объект относится к нескольким категориям), и ваш код должен усложняться.

Теперь подумайте о том, что отскакивает от (столкновения). Скажем, все отскакивает от всего остального, за исключением того, что ракета проходит через край экрана.

столкновения битовых масок для каждого объекта состоит из битов, которые представляют собой объекты, которые этот объект сталкивается с ИЭ:.

player.collsionBitMask   = 00001111 (15 in decimal) (the bits for all other objects are set) 
playerMissile.collisionBitMask = 00000111 (7) (all object EXCEPT screenEdge) 
enemy.collisonBitMask   = 00001111 (15) (everything) 
screenEdge.collisonBitMask  = 00000000 (0) (collides with nothing) 

Сейчас мы думаем о том, какие взаимодействия мы заинтересованы в объект, который мы хотим знать, когда :

  • игрок и противник касание
  • противника и игрок касания или враг и ракетная прикосновение игрока.

Это представлено:

player.contactTestBitMask = 00000100 (4) (the enemy's categoryBitMask) 
enemy.contractTestBitMask = 00000011 (3) (the player's categoryBitMask combined with the missile's categoryBitMask)) 

Обратите внимание, что если вы хотите знать, когда А и В осязание, это достаточно просто иметь contactTestBitMask A (в CTBM) включить categoryBitMask Б; вам не нужно, чтобы CTBM B также был включен в категорию A. Но если вы хотите, чтобы они отскакивали друг от друга, тогда столкновение каждого объекта в битбаке должно включать в себя категорию otherBitMask другого. Если A collisonbitMask включает категорию B, но не наоборот, тогда, когда столкновение 2, A отскакивает, но B не будет затронут.

Для вашего конкретного примера (категория Маска до 32 и маска столкновения до 11), categoryBitMask - это 32, которая равна 00100000 (приклеивается только 8 бит).CollisionBitMask имеет значение 11, что равно 8 + 4 + 1, поэтому в двоичном выражении это «00001101», что означает, что он сталкивается с объектами с помощью категорииBitMask 8, 4 или 1, поэтому я предполагаю, что есть объекты в вашей сцене с этими категориями.

По умолчанию все отскакивает от всего остального, то есть collisionBitMask - это все '1 i.e. b'111111 ..' и ничего не сообщает о контактах ни с чем другим, т. Е. ContactTestBitMask - это все '0'.

Кроме того - все это относится к физическим вещам, а не к узлам.

+0

Я печатаю это и собираюсь вытащить его из-под коагеранга, который держит его за собой, когда я иду. Осел ищет морковь. – Confused

+0

Я планирую сделать сообщение с документацией по теме, а затем еще один по использованию нескольких категорий для объекта и как отключить и включить отдельные биты ContactTest и столкновения (например, игрок собрал золотую монету, поэтому не связывается с синими монстрами в течение 10 секунд). –

+0

Жаль, что нет такой идеальной платформы для такого понимания и мудрости, и что SO удалось полностью замаскировать SO.docs всеми возможными способами и другими способами, о которых я действительно не думал. – Confused