SpriteKit позволяет избежать столкновения между двумя узлами - PullRequest
1 голос
/ 08 февраля 2020

Желаемое поведение

enter image description here

  • Красный узел (рука игрока) соединен с синим с помощью закрепленного соединения.
  • Красный узел имеет physicsBody, потому что: 1) он должен двигаться, если синий узел делает, и 2) он должен сталкиваться с остальным миром , но не с синей формой
  • И наоборот: синий узел (тело игрока) должен сталкиваться с остальным миром - , но, очевидно, не с красным узлом.

Задача

Узлы и соединение настроены нормально (см. Слева), но physicsBody взаимодействуют друг с другом (справа):

enter image description here

Обратите внимание : Чтобы получить правильное соединение, я должен был добавить дочерний узел (круг) к красной форме (рука игроков). Итак, мы здесь говорим о трех узлах.

Недавняя попытка

Пробовал кучу вещей. Следуя документации Apple и этой теме Я узнал, что это можно решить с помощью правильной комбинации categoryBitMask и collisionBitMask.

BitMasks:

struct Category {
    static let none: UInt32 = 0
    static let all: UInt32 = UInt32.max
    static let playerBody: UInt32 = 0b1 // 1
    static let playerArm: UInt32 = 0b10 // 2
    static let regularObject: UInt32 = 0b100 // 4
}

? Синяя форма:

body.categoryBitMask = Category.playerBody
body.collisionBitMask = Category.all

? Красная форма (а также ее дочерний узел для сустава):

body.categoryBitMask = Category.playerArm
body.collisionBitMask = Category.none

... но это не решать проблему.

Борется три дня подряд. Я знаю, что подобные вопросы уже задавались много раз, но ни один из них не привел меня в правильном направлении. Очень ценю любой совет!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Оказывается, что я развернул неправильную physicsBody для красной формы, поэтому изменения кода повлияли на неправильные узлы ?

Теперь это в основном работает так, как я описал в оригинале вопрос.

Однако - если вы новичок в этом топи c, как я: самое лучшее объяснение, которое я могу найти, это это (особенно «спросите себя» " часть). Удачного кодирования всем!

0 голосов
/ 08 февраля 2020

Это из документации Apple: collisionBitMask (но для Scenekit, может быть, то же самое в Spritekit)

Значением этого ключа является объект NSNumber, содержащий значение NSUInteger. SceneKit проверяет контакты только с физическими телами, чье свойство categoryBitMask перекрывается с этой битовой маской. Значение по умолчанию - all, указывая, что поиск должен проверять все физические тела независимо от их категории .

, поэтому вы не должны использовать Category.all

...