Я создал EventListener для контакта и добавил его в слой, над которым я работаю, PhysicsContact и Collisions между двумя PhysicsBody или PhysicsBody и PhysicsEdgeBody работает нормально, но с двумя PhysicsEdgeBody он вообще не работает.
Уже пытался:
но все еще не работает.
Есть что-то, чего мне не хватает?
Вот пример 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;
}
Задача ещё не решена.
Других решений пока нет …