void ColliderDetector::setActive(bool active) { if (_active == active) { return; } _active = active; #if ENABLE_PHYSICS_BOX2D_DETECT if (_body) { if (active) { setBody(_body); } else { for(auto object : *_colliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; b2Fixture *fixture = colliderBody->getB2Fixture(); _body->DestroyFixture(fixture); colliderBody->setB2Fixture(nullptr); } } } #elif ENABLE_PHYSICS_CHIPMUNK_DETECT if (_body) { if (_active) { for(auto object : *_colliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; cpShape *shape = colliderBody->getShape(); if(shape->space_private == nullptr) { cpSpaceAddShape(_body->space_private, shape); } } } else { for(auto object : *_colliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; cpShape *shape = colliderBody->getShape(); if (shape->space_private != nullptr) { cpSpaceRemoveShape(_body->space_private, shape); } } } } #endif }
void ColliderDetector::setActive(bool active) { if (m_bActive == active) { return; } m_bActive = active; if (m_pB2Body) { if (active) { setB2Body(m_pB2Body); } else { for(auto object : *m_pColliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; b2Fixture *fixture = colliderBody->getB2Fixture(); m_pB2Body->DestroyFixture(fixture); colliderBody->setB2Fixture(nullptr); } } } else if (m_pCPBody) { if (m_bActive) { for(auto object : *m_pColliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; cpShape *shape = colliderBody->getShape(); if(shape->space == nullptr) { cpSpaceAddShape(m_pCPBody->space, shape); } } } else { for(auto object : *m_pColliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; cpShape *shape = colliderBody->getShape(); if (shape->space != nullptr) { cpSpaceRemoveShape(m_pCPBody->space, shape); } } } } }
void ColliderDetector::setBody(b2Body *pBody) { _body = pBody; for(auto object : *_colliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; ContourData *contourData = colliderBody->getContourData(); const Array *array = &contourData->vertexList; Object *object = nullptr; b2Vec2 *b2bv = new b2Vec2[contourData->vertexList.count()]; int i = 0; for(auto object : *array) { ContourVertex2 *v = (ContourVertex2 *)object; b2bv[i].Set(v->x / PT_RATIO, v->y / PT_RATIO); i++; } b2PolygonShape polygon; polygon.Set(b2bv, contourData->vertexList.count()); CC_SAFE_DELETE(b2bv); b2FixtureDef fixtureDef; fixtureDef.shape = &polygon; fixtureDef.isSensor = true; b2Fixture *fixture = _body->CreateFixture(&fixtureDef); fixture->SetUserData(_bone); if (colliderBody->getB2Fixture() != nullptr) { _body->DestroyFixture(colliderBody->getB2Fixture()); } colliderBody->setB2Fixture(fixture); colliderBody->getColliderFilter()->updateShape(fixture); } }
void ColliderDetector::setB2Body(b2Body *pBody) { m_pB2Body = pBody; for(auto object : *m_pColliderBodyList) { ColliderBody *colliderBody = (ColliderBody *)object; ContourData *contourData = colliderBody->getContourData(); ContourVertex2 **vs = (ContourVertex2 **)contourData->m_tVertexList.data->arr; int num = contourData->m_tVertexList.count(); b2Vec2 *b2bv = new b2Vec2[num]; for (int i = 0; i < num; i++) { b2bv[i].Set(vs[i]->x / PT_RATIO, vs[i]->y / PT_RATIO); } b2PolygonShape polygon; polygon.Set(b2bv, contourData->m_tVertexList.count()); CC_SAFE_DELETE(b2bv); b2FixtureDef fixtureDef; fixtureDef.shape = &polygon; fixtureDef.isSensor = true; b2Fixture *fixture = m_pB2Body->CreateFixture(&fixtureDef); fixture->SetUserData(m_pBone); if (colliderBody->getB2Fixture() != nullptr) { m_pB2Body->DestroyFixture(colliderBody->getB2Fixture()); } colliderBody->setB2Fixture(fixture); colliderBody->getColliderFilter()->updateB2Shape(fixture); } }