Используя 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);
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);
Или еще лучше: не изменяйте битмакс по умолчанию, пока вам не понадобится.