два динамических тела, пересекающихся или перекрывающихся в cocos2d-x v3.2

0

Используя cocos2d-x v3.2, у меня есть буксируемые динамические тела bodyA и bodyB. А bodyB не имеет силы тяжести и имеет линейную скорость по оси x. bodyA имеет импульс по оси y. Проблема заключается в том, что bodyA проходит через bodyB. Ожидаемый результат: bodyA сталкивается с bodyB, bodyA отскакивает, а bodyB не влияет на столкновение. Вот пример кода, где bodyA проходит через bodyB.

PhysicsBody *bodyA = PhysicsBody::createCircle(spriteA->getContentSize().width/2);
bodyA->setDynamic(true);
bodyA->setMass(0.5f);
bodyA->setCategoryBitmask(1);
bodyA->setContactTestBitmask(true);

PhysicsBody *bodyB = PhysicsBody::createCircle(spriteB->getContentSize().width/2);
bodyB->setDynamic(true);
bodyB->setGravityEnable(false);
bodyB->setVelocity(Vect(100,0));
bodyB->setCollisionBitmask(2);
bodyB->setContactTestBitmask(true);
bodyB->setMass(5.0f);
Теги:
cocos2d-x

1 ответ

0

setContactTestBitmask не принимает bool, он должен принимать int, который является битовой маской, которая должна содержать все биты категории, с которыми должно взаимодействовать тело.

Прямо сейчас у ваших двух тел есть биты 0001 и 0010. Однако у вашей контактной битмаски установлен бит 0001 для обоих тел. Также вы используете битовую маску категории в bodyA и битмаску столкновения в bodyB.

Этот путь должен работать:

PhysicsBody *bodyA = PhysicsBody::createCircle(spriteA->getContentSize().width/2);
bodyA->setCategoryBitmask(1);
bodyA->setContactTestBitmask(2);

PhysicsBody *bodyB = PhysicsBody::createCircle(spriteB->getContentSize().width/2);
bodyB->setCategoryBitmask(2);
bodyB->setContactTestBitmask(1);

Или еще лучше: не изменяйте битмакс по умолчанию, пока вам не понадобится.

  • 0
    Благодарю. Я установил это как bool после просмотра видео . Я отредактировал мой код, как вы предложили, но результат все тот же.
  • 0
    попробуйте без установки битовых масок
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню