cocos2d c ++ Столкновение между краевыми физическими телами

Я работаю над игрой с cocos2d, нужно обнаружить столкновение двух PhysicsEdgeBody.

Я создал EventListener для контакта и добавил его в слой, над которым я работаю, PhysicsContact и Collisions между двумя PhysicsBody или PhysicsBody и PhysicsEdgeBody работает нормально, но с двумя PhysicsEdgeBody он вообще не работает.

Уже пытался:

  • установить значение для contactTestBitmask, collisionBitmask и categoryBitmask.
  • изменить значение массы и момента, так как их значением по умолчанию является PHYSICS_INFINITY
  • установить обе динамики тела
  • изменить материалы
  • добавить прослушиватель событий для групп и установить их на телах

но все еще не работает.

Есть что-то, чего мне не хватает?

Вот пример GameScene, созданного с помощью: Scene::createWithPhysics()

Также добавлена ​​команда: scene->getPhysicsWorld()->setDebugDrawMask(DEBUGDRAW_ALL);

//Node and PhysicsBody creation
PhysicsBody* bodyA = PhysicsBody::createEdgeBox(someSize, somePhysicsMaterial);

bodyA->setDynamic(true);
bodyA->setMass(100);
bodyA->setCategoryBitmask(0X01);       //0001
bodyA->setCollisionBitmask(0X02);      //0010
bodyA->setContactTestBitmask(0X02);    //0010

PhysicsBody* bodyB = PhysicsBody::createEdgeSegment(Vec2::ZERO, Vec2(visibleSize.width, 0), somePhysicsMaterial);

bodyB->setDynamic(true);
bodyB->setMass(100);
bodyB->setCategoryBitmask(0X02);       //0010
bodyB->setCollisionBitmask(0X01);      //0001
bodyB->setContactTestBitmask(0X01);    //0001

Node* nodeA = Node::create();

nodeA->setPosition(visibleCenter);
nodeA->setPhysicsBody(bodyA);

Node* nodeB = Node::create();

nodeB->setPosition(Vec2::ZERO);
nodeB->setPhysicsBody(bodyB);

this->addChild(nodeA);
this->addChild(nodeB);

//EventListener creation
auto cListener = EventListenerPhysicsContact::create();

cListener->onContactBegan = CC_CALLBACK__1(GameScene::onContactBegan, this);
cListener->onContactPreSolve = CC_CALLBACK_"(GameScene::onContactPreSolve, this);

this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(cListener, this);

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

//onContactBegan Callback
bool GameScene::onContactBegan(PhysicsContact &contact)
{
PhysicsBody *bodyA = contact.getShapeA()->getPhysicsBody();
PhysicsBody *bodyB = contact.getShapeB()->getPhysicsBody();

if ((bodyA->getCategoryBitmask() == 0X01 && bodyB->getCategoryBitmask() == 0X02) ||
(bodyA->getCategoryBitmask() == 0X02 && bodyB->getCategoryBitmask() == 0X01))
{
CCLOG("COLLISION");
return true;
}
return false;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]