коллизии в swift и spritekit

Я работаю с простой игрой, используя Swift и Spritekit .

В моей сцене есть 4 узла: nodeA1, nodeA2, nodeB1 и nodeB2.

Таким образом, узел A1 может соприкасаться с узлом A2 и узел B1 может соприкасаться с узлом B2 .

Я хочу

nodeA2 сенсорный nodeB2 без сенсорного nodeA1 nodeB1 и nodeB2 и nodeB1 одинаковы.

Это возможно ?


person mazen    schedule 14.12.2017    source источник
comment
Вы имеете в виду коллизии, то есть вы хотите, чтобы nodeA1 и nodeA2 отскакивали друг от друга, а nodeB1 и nodeB2 также отскакивали друг от друга, но чтобы узлы A1 и A2 проходили прямо через узлы B1 и B2? Или вы имеете в виду контакты, то есть вы хотите получать уведомления, когда соприкасаются nodeA1 и nodeA2, а также когда соприкасаются nodeB1 и nodeB2, но вас не интересует, касаются ли A1 или A2 B1 и B2?   -  person Steve Ives    schedule 14.12.2017
comment
эй, @SteveIves (я имею в виду коллизии), да, узлы A1 и A2 отскакивают друг от друга, узлы B1 и B2 отскакивают друг от друга, и важная часть A2 и B2 отскакивают друг от друга   -  person mazen    schedule 14.12.2017


Ответы (1)


Да, это определенно возможно, независимо от того, имеете ли вы в виду коллизии или контакты ????

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

РЕДАКТИРОВАТЬ - код здесь для коллизий, как описано:

  1. Определите уникальные категории, убедитесь, что ваш класс является SKPhysicsContactDelegate, и назначьте себя делегатом контакта с физикой:

    //Категории физики let nodeA1Category: UInt32 = 1 ‹‹ 0 // b'00001' let nodeA2Category: UInt32 = 1 ‹‹ 1 // b'00010' let nodeB1Category: UInt32 = 1 ‹‹ 2 // b'00100' let nodeB2Category: UInt32 = 1 ‹‹ 3 // b'01000'

    класс GameScene: SKScene, SKPhysicsContactDelegate { physicsWorld.contactDelegate = self

  2. Назначьте категории (обычно в didMove(to view:) :

    nodeA1.physicsBody.catgeoryBitMask = nodeA1Category nodeA2.physicsBody.catgeoryBitMask = nodeA2Category nodeB1.physicsBody.catgeoryBitMask = nodeB1Category nodeB2.physicsBody.catgeoryBitMask = nodeB2Category

(Убедитесь, что вы создали физические тела для каждого узла со свойством isDynamic, установленным на true)

  1. Настройка коллизий:

    nodeA1.physicsBody?.collisionBitMask = nodeA2Category // A1 сталкивается с A2 nodeA2.physicsBody?.collisionBitMask = nodeA1Category // A2 сталкивается с A1

    nodeB1.physicsBody?.collisionBitMask = nodeB2Category // B1 сталкивается с B2 nodeB2.physicsBody?.collisionBitMask = nodeB1Category // B2 сталкивается с B1

    nodeA2.physicsBody?.collisionBitMask = nodeB2Category // A2 сталкивается с B2 nodeB2.physicsBody?.collisionBitMask = nodeA2Category // B2 сталкивается с A2

Теперь вы должны получить все коллизии, которые хотите, но не уведомления о контактах. Если вы хотите что-то сделать, когда эти узлы сталкиваются, вам придется реализовать contactTest битовые маски, а также метод didBeg(contact:).

person Steve Ives    schedule 14.12.2017