PhysicsBody -allContactedBodies как составить список суставов в PhysicsWorld

Я делаю игру с множеством тел разных категорий. Когда пользователь перемещает одно тело и сталкивается с другим телом той же категории, они приклеиваются друг к другу. Когда всего склеиваются три тела, они исчезают.

У тел есть битовая маска для конкретной категории и CNPhysicsCategoryGenBody, идентифицирующий тело в целом. Это требование игры, потому что в столкновении участвуют другие тела, которые не контролируются пользователем и не приклеиваются друг к другу.

Код didBeginContact, задействованный в склейке тел:

// Here I clean the mask removing the CNPhysicsCategoryGenBody and leaving the object particular
// category only.
uint32_t cleanMaskA = contact.bodyA.categoryBitMask ^ CNPhysicsCategoryGenBody;
uint32_t cleanMaskB = contact.bodyB.categoryBitMask ^ CNPhysicsCategoryGenBody;

// If the objects are of the same category create a joint
if (cleanMaskA == cleanMaskB) {

    SKPhysicsJointFixed *newJoint = [SKPhysicsJointFixed jointWithBodyA:contact.bodyA bodyB:contact.bodyB anchor:contact.contactPoint];
    [self.physicsWorld addJoint:newJoint];
}

Все идет нормально. Проблема возникает, когда я хочу перечислить тела, которые прикреплены к другому. Метод SKPhysicsBody -allContactedBodies не возвращает тела в соединении. Я думаю, это, вероятно, потому, что тело прикреплено к суставу, а не к другому телу.

В SKPhysicsWorld есть методы для добавления или удаления соединений, но я не могу найти способ перечислить тела, которые участвуют в соединении. Мне нужно перечислить эти тела, чтобы проверить, какие тела склеены, посмотреть, не больше ли они определенного числа, и удалить их.


person zago    schedule 07.02.2014    source источник


Ответы (1)


Метод allContactedBodies действительно не возвращает тела, участвующие в соединении.

Чтобы перечислить органы, участвующие в соединении, у вас есть два готовых варианта:

1) геттеры newJoint.bodyA.node и newJoint.bodyB.node вернут 2 тела в каждом суставе
2) еще лучше, пойдите наоборот - переберите все тела ваших узлов и используйте свойство physicsBody.joints - это вернет массив суставы, к которым подключено это тело, затем сравните суставы, чтобы получить фактические группы склеенных тел.

person Batalia    schedule 07.02.2014
comment
Спасибо. Я попробовал physicsBody.joints, и он работал со списком всех тел. Проблема, которую я обнаружил, заключалась в попытке перебрать все тела. Количество комбинаций было достаточно большим. Я решил создать массив для хранения групп соединенных тел, а затем проверить, содержит ли массив больше тел, чем предел, чтобы удалить их все. Но проблема заключалась в том, что тела действительно могли двигаться в точке шарнира, и они соприкасались друг с другом, выглядя так, будто две группы снова объединились. Я думаю, что мне нужно работать над логикой этого. Спасибо за подсказку в любом случае. - person zago; 11.02.2014