bool GameLayer::onContactBegin(cocos2d::PhysicsContact& contact) { auto bodyA = contact.getShapeA()->getBody(); auto bodyB = contact.getShapeB()->getBody(); auto componentA = static_cast<BaseComponent*>( bodyA->getNode() ); auto componentB = static_cast<BaseComponent*>( bodyB->getNode() ); bool resA = componentA->onContactBegin(contact); bool resB = componentB->onContactBegin(contact); return resA && resB; }
void EventListenerPhysicsContact::onEvent(EventCustom* event) { PhysicsContact* contact = dynamic_cast<PhysicsContact*>(event); if (contact == nullptr) { return; } switch (contact->getEventCode()) { case PhysicsContact::EventCode::BEGIN: { bool ret = true; if (onContactBegin != nullptr && hitTest(contact->getShapeA(), contact->getShapeB())) { contact->generateContactData(); ret = onContactBegin(*contact); } contact->setResult(ret); break; } case PhysicsContact::EventCode::PRESOLVE: { bool ret = true; if (onContactPreSolve != nullptr && hitTest(contact->getShapeA(), contact->getShapeB())) { PhysicsContactPreSolve solve(contact->_contactInfo); contact->generateContactData(); ret = onContactPreSolve(*contact, solve); } contact->setResult(ret); break; } case PhysicsContact::EventCode::POSTSOLVE: { if (onContactPostSolve != nullptr && hitTest(contact->getShapeA(), contact->getShapeB())) { PhysicsContactPostSolve solve(contact->_contactInfo); onContactPostSolve(*contact, solve); } break; } case PhysicsContact::EventCode::SEPERATE: { if (onContactSeperate != nullptr && hitTest(contact->getShapeA(), contact->getShapeB())) { onContactSeperate(*contact); } break; } default: break; } }