void SpriteBatchNode::removeSpriteFromAtlas(Sprite *sprite) { // remove from TextureAtlas _textureAtlas->removeQuadAtIndex(sprite->getAtlasIndex()); // Cleanup sprite. It might be reused (issue #569) sprite->setBatchNode(nullptr); auto it = std::find(_descendants.begin(), _descendants.end(), sprite ); if( it != _descendants.end() ) { auto next = std::next(it); Sprite *spr = nullptr; for(; next != _descendants.end(); ++next) { spr = *next; spr->setAtlasIndex( spr->getAtlasIndex() - 1 ); } _descendants.erase(it); } // remove children recursively auto& children = sprite->getChildren(); for(const auto &obj: children) { Sprite* child = static_cast<Sprite*>(obj); if (child) { removeSpriteFromAtlas(child); } } }
void CABatchView::removeSubview(CAView* subview) { CAView *pSprite = (CAView*)(subview); if (pSprite == NULL) { return; } removeSpriteFromAtlas(pSprite); CAView::removeSubview(pSprite); }
void CCSpriteBatchNode::removeAllChildrenWithCleanup(bool bCleanup) { // Invalidate atlas index. issue #569 if (m_pChildren && m_pChildren->count() > 0) { CCObject* pObject = NULL; CCARRAY_FOREACH(m_pChildren, pObject) { CCSprite* pChild = (CCSprite*) pObject; if (pChild) { removeSpriteFromAtlas(pChild); } }
// override remove child void SpriteBatchNode::removeChild(Node *child, bool cleanup) { Sprite *pSprite = (Sprite*)(child); // explicit null handling if (pSprite == NULL) { return; } CCASSERT(_children->containsObject(pSprite), "sprite batch node should contain the child"); // cleanup before removing removeSpriteFromAtlas(pSprite); Node::removeChild(pSprite, cleanup); }
// override remove child void CCSpriteBatchNode::removeChild(CCNode *child, bool cleanup) { CCSprite *pSprite = (CCSprite*)(child); // explicit null handling if (pSprite == NULL) { return; } assert(m_pChildren->containsObject(pSprite)); // cleanup before removing removeSpriteFromAtlas(pSprite); CCNode::removeChild(pSprite, cleanup); }
// override remove child //将一个CCNode指针从子结点数组中删除,并根所参数决定是否释放元素 void CCSpriteBatchNode::removeChild(CCNode *child, bool cleanup) { CCSprite *pSprite = (CCSprite*)(child); // explicit null handling if (pSprite == NULL) { return; } //确保子结点树中有pSprite CCAssert(m_pChildren->containsObject(pSprite), "sprite batch node should contain the child"); // cleanup before removing//移除一个指定的CCSprite指针 removeSpriteFromAtlas(pSprite); //调用基类的移除子结点函数 CCNode::removeChild(pSprite, cleanup); }
// override remove child void SpriteBatchNode::removeChild(Node *child, bool cleanup) { Sprite *sprite = static_cast<Sprite*>(child); // explicit null handling if (sprite == nullptr) { return; } CCASSERT(_children.contains(sprite), "sprite batch node should contain the child"); // cleanup before removing removeSpriteFromAtlas(sprite); Node::removeChild(sprite, cleanup); }
/// override remove child KDvoid CCSpriteBatchNode::removeChild ( CCNode* pChild, KDbool bCleanup ) { CCSprite* pSprite = (CCSprite *) ( pChild ); // explicit null handling if ( pSprite == KD_NULL ) { return; } CCAssert ( m_pChildren->containsObject ( pSprite ), "sprite batch node should contain the child" ); // cleanup before removing removeSpriteFromAtlas ( pSprite ); CCNode::removeChild ( pSprite, bCleanup ); }
void CCSpriteBatchNode::removeSpriteFromAtlas(CCSprite *pobSprite) { // remove from TextureAtlas m_pobTextureAtlas->removeQuadAtIndex(pobSprite->getAtlasIndex()); // Cleanup sprite. It might be reused (issue #569) pobSprite->useSelfRender(); unsigned int uIndex = m_pobDescendants->getIndexOfObject(pobSprite); if (uIndex != -1) { m_pobDescendants->removeObjectAtIndex(uIndex); // update all sprites beyond this one unsigned int count = m_pobDescendants->count(); for(; uIndex < count; ++uIndex) { CCSprite* s = (CCSprite*)(m_pobDescendants->getObjectAtIndex(uIndex)); s->setAtlasIndex( s->getAtlasIndex() - 1 ); } } // remove children recursively NSMutableArray<CCNode*> *pChildren = pobSprite->getChildren(); if (pChildren && pChildren->count() > 0) { CCSprite *pSprite; NSMutableArray<CCNode*>::NSMutableArrayIterator iter; for (iter = pChildren->begin(); iter != pChildren->end(); ++iter) { pSprite = (CCSprite*)(*iter); if (! pSprite) { break; } removeSpriteFromAtlas(pSprite); } } }