示例#1
0
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;
}
示例#2
0
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;
    }
}