Физический эффект SpriteKit Body потерян

Сначала я добавил

skView.showsPhysics = YES;

Чтобы увидеть схему физического тела.

НО

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

// Ball     
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.size.height/2];
        self.physicsBody.categoryBitMask = ballCategory;
        self.physicsBody.contactTestBitMask = bottomCategory;

Также я создал физическое тело с нижним краем, чтобы получать сообщения о столкновениях:

// Bottom edge 
    CGRect bottomRect = CGRectMake(self.frame.origin.x, self.frame.origin.y + 25, self.frame.size.width, 10);
        SKNode* bottom = [SKNode node];
        bottom.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:bottomRect];
        [self addChild:bottom];

которые корректно взаимодействовали друг с другом до того, как я добавил битовую маску к нижнему краю

bottom.physicsBody.categoryBitMask = bottomCategory;
bottom.physicsBody.collisionBitMask = ballCategory;

Маски:

static const uint32_t ballCategory  = 0x1 << 0;  // 00000000000000000000000000000001
static const uint32_t bottomCategory = 0x1 << 1; // 00000000000000000000000000000010

Оно остановило работу. Хм...

Я закомментировал назначение маски нижнему краю - это работает. Потом привязал к нижнему краю другую - шаровую маску - опять не работает.

Наверное, я что-то упустил в документации, но теперь не могу найти ответ, почему это происходит.

введите здесь описание изображения


person Injectios    schedule 18.03.2014    source источник


Ответы (1)


bottom.physicsBody.categoryBitMask = bottomCategory;

Это заставляет bottom соприкасаться/сталкиваться только с телами, contactBitMask которых содержит бит bottomCategory.

Поэтому, если вы добавите эту категорию к своим шарам, они должны снова столкнуться с дном:

ball.physicsBody.contactTestBitMask = ballCategory | bottomCategory;

Дополнительные сведения см. в руководстве по Box2D Главе 7.2 — Фильтрация.

person LearnCocos2D    schedule 18.03.2014
comment
5 минут назад я понял, что ошибся в своем коде. Набрав contactTestBitMask - я нажал Enter, когда появилось автозаполнение, и оно превратилось в CollisionBitMask.... брррр. Но, согласен с тобой - person Injectios; 18.03.2014