void TestColliderDetector::update(float delta) { armature2->setVisible(true); world->Step(delta, 0, 0); for (std::list<Contact>::iterator it = listener->contact_list.begin(); it != listener->contact_list.end(); ++it) { Contact &contact = *it; //! get armature by fixtrue's user data CCBone *ba = (CCBone *)contact.fixtureA->GetUserData(); CCBone *bb = (CCBone *)contact.fixtureB->GetUserData(); bb->getArmature()->setVisible(false); } }
void TestColliderDetector::update(float delta) { armature2->setVisible(true); CCRect rect = bullet->boundingBox(); // This code is just telling how to get the vertex. // For a more accurate collider detection, you need to implemente yourself. CCDictElement *element = NULL; CCDictionary *dict = armature2->getBoneDic(); CCDICT_FOREACH(dict, element) { CCBone *bone = static_cast<CCBone*>(element->getObject()); CCArray *bodyList = bone->getColliderBodyList(); CCObject *object = NULL; CCARRAY_FOREACH(bodyList, object) { ColliderBody *body = static_cast<ColliderBody*>(object); CCArray *vertexList = body->getCalculatedVertexList(); float minx, miny, maxx, maxy = 0; int length = vertexList->count(); for (int i = 0; i<length; i++) { CCContourVertex2 *vertex = static_cast<CCContourVertex2*>(vertexList->objectAtIndex(i)); if (i == 0) { minx = maxx = vertex->x; miny = maxy = vertex->y; } else { minx = vertex->x < minx ? vertex->x : minx; miny = vertex->y < miny ? vertex->y : miny; maxx = vertex->x > maxx ? vertex->x : maxx; maxy = vertex->y > maxy ? vertex->y : maxy; } } CCRect temp = CCRectMake(minx, miny, maxx - minx, maxy - miny); if (temp.intersectsRect(rect)) { armature2->setVisible(false); } }
CCBone* CCBone::create(bool _isRadian) { if( !sObjectPool ){ sObjectPool = new CCArray(); CCAssert(sObjectPool->init(), "create CCBone fail!"); } sPoolIndex++; if ( sPoolIndex < sObjectPool->count()) { CCBone* _bone =(CCBone*) sObjectPool->objectAtIndex(sPoolIndex); return _bone; } CCBone *pBone = new CCBone(); if (pBone && pBone->init(_isRadian)){ sObjectPool->addObject(pBone); pBone->autorelease(); return pBone; } CC_SAFE_DELETE(pBone); return NULL; }
void CCArmatureAnimation::setSpeedScale(float speedScale) { if(speedScale == m_fSpeedScale) { return; } m_fSpeedScale = speedScale; m_fProcessScale = !m_pMovementData ? m_fSpeedScale : m_fSpeedScale * m_pMovementData->scale; CCDictElement *element = NULL; CCDictionary *dict = m_pArmature->getBoneDic(); CCDICT_FOREACH(dict, element) { CCBone *bone = (CCBone *)element->getObject(); bone->getTween()->setProcessScale(m_fProcessScale); if (bone->getChildArmature()) { bone->getChildArmature()->getAnimation()->setProcessScale(m_fProcessScale); } }
bool CCArmature::init(const char *name) { bool bRet = false; do { removeAllChildren(); CC_SAFE_DELETE(m_pAnimation); m_pAnimation = new CCArmatureAnimation(); m_pAnimation->init(this); CC_SAFE_DELETE(m_pBoneDic); m_pBoneDic = new CCDictionary(); CC_SAFE_DELETE(m_pTopBoneList); m_pTopBoneList = new CCArray(); m_pTopBoneList->init(); CC_SAFE_DELETE(m_pTextureAtlasDic); m_pTextureAtlasDic = new CCDictionary(); m_sBlendFunc.src = CC_BLEND_SRC; m_sBlendFunc.dst = CC_BLEND_DST; m_strName = name == NULL ? "" : name; CCArmatureDataManager *armatureDataManager = CCArmatureDataManager::sharedArmatureDataManager(); if(m_strName.length() != 0) { m_strName = name; CCAnimationData *animationData = armatureDataManager->getAnimationData(name); CCAssert(animationData, "CCAnimationData not exist! "); m_pAnimation->setAnimationData(animationData); CCArmatureData *armatureData = armatureDataManager->getArmatureData(name); CCAssert(armatureData, ""); m_pArmatureData = armatureData; CCDictElement *_element = NULL; CCDictionary *boneDataDic = &armatureData->boneDataDic; CCDICT_FOREACH(boneDataDic, _element) { CCBone *bone = createBone(_element->getStrKey()); //! init bone's CCTween to 1st movement's 1st frame do { CCMovementData *movData = animationData->getMovement(animationData->movementNames.at(0).c_str()); CC_BREAK_IF(!movData); CCMovementBoneData *movBoneData = movData->getMovementBoneData(bone->getName().c_str()); CC_BREAK_IF(!movBoneData || movBoneData->frameList.count() <= 0); CCFrameData *frameData = movBoneData->getFrameData(0); CC_BREAK_IF(!frameData); bone->getTweenData()->copy(frameData); bone->changeDisplayWithIndex(frameData->displayIndex, false); } while (0); } update(0); updateOffsetPoint(); }