Как я могу расположить два SKSpritenode друг над другом, если у них обоих есть набор SKPhysicsBody? - PullRequest
0 голосов
/ 04 августа 2020

Я работаю на уровне новичка над простой игрой. У меня есть слоты и по пять шаров на каждый слот.

Идея в том, что шары go попадают в слоты, и да, шары имеют zPosition, которое на единицу выше, чем слоты. Но они оба являются дочерними элементами невидимого держателя слота внизу.

Шары помещаются в слоты, если ни слоты, ни шары не имеют набора PhysicalBody. Но если я дам им PhysicsBody, они уберут sh друг друга.

Итак, очевидно, что у меня все еще есть некоторые физические свойства, которых я не понимаю. Если бы кто-нибудь мог указать мне на пути?

No Physics

Оба с набором физики

1 Ответ

2 голосов
/ 04 августа 2020

У вас включены столкновения между этими двумя телами.

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

Контакты - это когда вы хотите, чтобы ваш код был уведомлен, когда 2 тела вступают в контакт. Тела можно настроить так, чтобы они контактировали, но не сталкивались, сталкивались, но не контактировали, сталкивались и регистрировали контакт или ни то, ни другое. Вдобавок одно тело может столкнуться со вторым телом без столкновения второго тела с первым (столкновение не повлияет на движение второго тела, в то время как первое тело может go улететь).

Если вы это сделаете ничего при создании среды Sprite Kit, столкновения включены между всеми телами (все отскакивает от всего) и контакты не включены ни для одного тела (ваш код никогда не будет вызываться, когда тела соприкасаются), поэтому во время настройки обычно приходится переключать выключить определенные столкновения и включить включить определенные контакты.

Столкновения между телами можно отключить (оставив существующие столкновения без изменений), используя:

nodeA.physicsBody?.collisionBitMask &= ~nodeB.category

Мы логически ИЛИ битовую маску коллизии nodeA с инверсией (логическое НЕ, оператор ~) битовой маски категории nodeB, чтобы «выключить» этот бит битовой маски nodeA. например, чтобы красный круг не сталкивался с 'слотом':

redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~slotCategory

, который можно сократить до:

redCircle.physicsBody?.collisionBitMask &= ~slotCategory

это предполагает, что redCircle и slotCategory - это имена, которые вы используете для узла и битовых масок категории.

Это предотвратит отскакивание красного круга от слота, но не остановит отскакивание слот от красного круга, поэтому вам также могут понадобиться:

slotX.physicsBody?.collisionBitMask &= ~circleCategory

для каждого слота и при условии, что каждый круг принадлежит одной и той же категории.

Дополнительная информация здесь:

мое пошаговое руководство для столкновений и контактов: { ссылка }

И руководство по битовым маскам коллизий и тестов контактов: { ссылка }

Манипулирование битовыми масками для отключения отдельных контактов и контактов столкновения и на. { ссылка }

...