Категории
Вы можете иметь 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