void CCDisplayFactory::initSpriteDisplay(CCBone *bone, CCDecorativeDisplay *decoDisplay, const char *displayName, CCSkin *skin) { //! remove .xxx std::string textureName = displayName; CCTextureData *textureData = CCArmatureDataManager::sharedArmatureDataManager()->getTextureData(textureName.c_str()); if(textureData) { //! Init display anchorPoint, every Texture have a anchor point skin->setAnchorPoint(ccp( textureData->pivotX, textureData->pivotY)); } #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT if (textureData && textureData->contourDataList.count() > 0) { //! create ContourSprite CCColliderDetector *colliderDetector = CCColliderDetector::create(bone); colliderDetector->addContourDataList(&textureData->contourDataList); decoDisplay->setColliderDetector(colliderDetector); } #endif }
CCColliderDetector *CCColliderDetector::create(CCBone *bone) { CCColliderDetector *pColliderDetector = new CCColliderDetector(); if (pColliderDetector && pColliderDetector->init(bone)) { pColliderDetector->autorelease(); return pColliderDetector; } CC_SAFE_DELETE(pColliderDetector); return NULL; }
void CCDisplayFactory::updateDisplay(CCBone *bone, float dt, bool dirty) { CCNode *display = bone->getDisplayRenderNode(); CS_RETURN_IF(!display); switch(bone->getDisplayRenderNodeType()) { case CS_DISPLAY_SPRITE: if (dirty) { (static_cast<CCSkin*>(display))->updateArmatureTransform(); } break; case CS_DISPLAY_PARTICLE: updateParticleDisplay(bone, display, dt); break; case CS_DISPLAY_ARMATURE: updateArmatureDisplay(bone, display, dt); break; default: display->setAdditionalTransform(bone->nodeToArmatureTransform()); break; } #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT || ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX if (dirty) { CCDecorativeDisplay *decoDisplay = bone->getDisplayManager()->getCurrentDecorativeDisplay(); CCColliderDetector *detector = decoDisplay->getColliderDetector(); if (detector) { do { #if ENABLE_PHYSICS_BOX2D_DETECT CC_BREAK_IF(!detector->getBody()); #elif ENABLE_PHYSICS_CHIPMUNK_DETECT CC_BREAK_IF(!detector->getBody()); #endif CCAffineTransform displayTransform = display->nodeToParentTransform(); CCPoint anchorPoint = display->getAnchorPointInPoints(); anchorPoint = CCPointApplyAffineTransform(anchorPoint, displayTransform); displayTransform.tx = anchorPoint.x; displayTransform.ty = anchorPoint.y; CCAffineTransform t = CCAffineTransformConcat(displayTransform, bone->getArmature()->nodeToParentTransform()); detector->updateTransform(t); } while (0); } } #endif }
NS_CC_EXT_BEGIN CCColliderDetector *CCColliderDetector::create() { CCColliderDetector *pColliderDetector = new CCColliderDetector(); if (pColliderDetector && pColliderDetector->init()) { pColliderDetector->autorelease(); return pColliderDetector; } CC_SAFE_DELETE(pColliderDetector); return NULL; }
void CCDisplayFactory::updateDisplay(CCBone *bone, CCDecorativeDisplay *decoDisplay, float dt, bool dirty) { CS_RETURN_IF(!decoDisplay); #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT if (dirty) { CCColliderDetector *detector = decoDisplay->getColliderDetector(); if (detector) { do { #if ENABLE_PHYSICS_BOX2D_DETECT CC_BREAK_IF(!detector->getBody()); #elif ENABLE_PHYSICS_CHIPMUNK_DETECT CC_BREAK_IF(!detector->getBody()); #endif CCNode *node = decoDisplay->getDisplay(); CCAffineTransform displayTransform = node->nodeToParentTransform(); CCPoint anchorPoint = node->getAnchorPointInPoints(); anchorPoint = CCPointApplyAffineTransform(anchorPoint, displayTransform); displayTransform.tx = anchorPoint.x; displayTransform.ty = anchorPoint.y; CCAffineTransform t = CCAffineTransformConcat(displayTransform, bone->getArmature()->nodeToParentTransform()); detector->updateTransform(t); } while (0); } } #endif CCNode *display = decoDisplay->getDisplay(); switch(decoDisplay->getDisplayData()->displayType) { case CS_DISPLAY_SPRITE: updateSpriteDisplay(bone, display, dt, dirty); break; case CS_DISPLAY_PARTICLE: updateParticleDisplay(bone, display, dt, dirty); break; case CS_DISPLAY_ARMATURE: updateArmatureDisplay(bone, display, dt, dirty); break; default: { display->setAdditionalTransform(bone->nodeToArmatureTransform()); } break; } }
void CCDisplayFactory::initSpriteDisplay(CCBone *bone, CCDecorativeDisplay *decoDisplay, const char *displayName, CCSkin *skin) { //! remove .xxx std::string textureName = displayName; size_t startPos = textureName.find_last_of("."); if(startPos != std::string::npos) { textureName = textureName.erase(startPos); } CCTextureData *textureData = CCArmatureDataManager::sharedArmatureDataManager()->getTextureData(textureName.c_str()); #ifdef Hunter if (textureData == NULL) { // ³¢ÊÔÈ¥µô»»×°µÄǰ׺ textureName = textureName.substr(textureName.find("_") + 1); textureData = CCArmatureDataManager::sharedArmatureDataManager()->getTextureData(textureName.c_str()); } #endif // Hunter if(textureData) { //! Init display anchorPoint, every Texture have a anchor point skin->setAnchorPoint(ccp( textureData->pivotX, textureData->pivotY)); } #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT || ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX if (textureData && textureData->contourDataList.count() > 0) { //! create ContourSprite CCColliderDetector *colliderDetector = CCColliderDetector::create(bone); colliderDetector->addContourDataList(&textureData->contourDataList); decoDisplay->setColliderDetector(colliderDetector); } #endif }