Beispiel #1
0
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);
        }
    }
}
Beispiel #2
0
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);
                }
            }
Beispiel #4
0
// 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);
}
Beispiel #7
0
// 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);
			}
		}
	}