Как работает битовая маска категории в SpriteKit? (0xFFFFFFFF)

Мне трудно понять, как работает эта битовая маска. Я знаю, что по умолчанию установлено значение 0xFFFFFFFF, и если вы хотите, чтобы два тела связывались, вы устанавливаете две разные битовые маски.

Моя проблема в том, как я могу установить 2 (или более) разных битмаски, как я могу изменить значение по умолчанию, чтобы получить другое значение? Я знаю, что существует 32 различных категории. Не могли бы вы дать мне некоторые из них?


person B.Ticca    schedule 23.02.2018    source источник


Ответы (1)


Категории

Вы можете иметь 32 различных категорий. Категории могут быть: судно, пули, стена, враги и т. д.). Если вас интересуют столкновения и контакты, вам нужно сначала установить категорию для данного объекта. Например, категория корабля 0, категория пуль 1, категория стены 2, категория врагов 3. Поскольку они являются битовыми масками, у вас есть (соответственно) 1, 2, 4, 8. Теперь категории больше зависят от поведения, чем от идентичности. Некоторые объекты могут вести себя как две разные категории: камни (отсутствуют категории как таковые) ведут себя как стены (вы отскакиваете от них) и враги (вы можете бросить в них пулю). Тогда категории для камней будут 2 и 3, поскольку битовая маска дает 12. Нелегко представить, что объект находится в разных категориях, но если вы думаете о наборах поведения, а не о наборах идентичности, об этом легко думать. .

Значение по умолчанию для масок — 0xFFFFFFFF, что означает, что каждый объект находится во всех возможных категориях, и каждый объект сталкивается с любым другим. Тонкая настройка этих значений может серьезно улучшить физический движок.

Столкновения

Столкновения используются для определения того, какие объекты сталкиваются в физическом мире. Некоторые объекты могут пересекаться друг с другом, в то время как другие отскакивают. Пример: волшебная пуля может летать по стенам, а обычные останавливаются у стен.

magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2

ordinaryBullet.physicsBody.collisionBitMask = 2 // hits walls
magicBullet.physicsBody.collisionBitMask = 0 // do not physically see walls

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

Контакты

Контакты — это то же самое, что и столкновения, но для фиксации в вашем коде того факта, что два объекта соприкасаются. Итак, если вас интересует попадание обычных пуль в стену (для магических это не обязательно интересно):

ordinaryBullet.physicsBody.contactTestBitMask = 2 // want to catch wall hit
magicBullet.physicsBody.contactTestBitMask = 0 // don't bother

Несколько более сложный пример

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

magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2 // some bullets may travel through
hardWall.physicsBody.categoryBitMask = 4 // nothing can travel through thses

ordinaryBullet.physicsBody.collisionBitMask = 6 // hits walls and hard walls
magicBullet.physicsBody.collisionBitMask = 4 // do not physically see walls but only hard walls

ordinaryBullet.physicsBody.contactTestBitMask = 6 // want to catch all wall hit
magicBullet.physicsBody.contactTestBitMask = 4 // just want to catch hard wall hitting
person Jean-Baptiste Yunès    schedule 23.02.2018