2015-06-04 67 views

回答

0

更新20160408: 我再次用Google搜索這一點,和谷歌建議此頁......,我要感謝我過去的自己:-) 這一次,我寫了一方便的工具功能:

void Mjcocoshelper::rendernodetospriteframecache(Node* node, std::string nameincache) { 
    const Size SIZE = node->getBoundingBox().size; 
    auto render = RenderTexture::create(SIZE.width, SIZE.height); 
    render->begin(); 

    const Vec2 POS_BEFORE = node->getPosition(); 
    const bool IGNORE_BEFORE = node->isIgnoreAnchorPointForPosition(); 
    const float SCALEY_BEFORE = node->getScaleY(); 

    node->ignoreAnchorPointForPosition(false); 
    node->setPosition(SIZE.width * 0.5f, SIZE.height * 0.5f); 
    node->setScaleY(-1.0f); // Or it gets upside down? 
    node->visit(); 
    node->ignoreAnchorPointForPosition(IGNORE_BEFORE); 
    node->setPosition(POS_BEFORE); 
    node->setScaleY(SCALEY_BEFORE); 

    render->end(); 

    auto spriteNew = render->getSprite(); 
    Texture2D* texture2d = spriteNew->getTexture(); 
    SpriteFrame* spriteframeOff = SpriteFrame::createWithTexture(texture2d, Rect(0, 0, texture2d->getContentSize().width, texture2d->getContentSize().height)); 
    SpriteFrameCache::getInstance()->addSpriteFrame(spriteframeOff, nameincache); 
} 

老:

我想通了,這還挺整潔的解決辦法:

std::string framenameOff; 
{ 
    Texture2D* texture2d = mjpromobuttonx.textureOff(); 
    SpriteFrame* spriteframeOff = SpriteFrame::createWithTexture(texture2d, Rect(0, 0, texture2d->getContentSize().width, texture2d->getContentSize().height)); 
    framenameOff = "autobutton_off_" + std::to_string(++buttonsaddedtocacheoff); 
    SpriteFrameCache::getInstance()->addSpriteFrame(spriteframeOff, framenameOff); 
} 
std::string framenameOn; 
{ 
    Texture2D* texture2d = mjpromobuttonx.textureOff(); 
    SpriteFrame* spriteframeOn = SpriteFrame::createWithTexture(texture2d, Rect(0, 0, texture2d->getContentSize().width, texture2d->getContentSize().height)); 
    framenameOn = "autobutton_on_" + std::to_string(++buttonsaddedtocacheon); 
    SpriteFrameCache::getInstance()->addSpriteFrame(spriteframeOn, framenameOn); 
} 

Button* item = Button::create(framenameOff, framenameOn, framenameOff, TextureResType::PLIST); 

因此,它會將spriteframes動態添加到sprite幀緩存中。我們必須確保我們存儲的名稱不會覆蓋其他任何內容,並且我們還必須爲添加到緩存的每個映像不斷創建新名稱。在一些極端的悲傷場合,這可能會覆蓋一些現有的圖像,所以我會給這更多的一些...也許...有時...

Bonus: 我確實有一個我以前創建的ObjC框架從遠程服務器獲取圖像......現在我重複使用它,並且還需要轉換UIImage:該框架最終會傳遞給C++,然後傳遞給Cocos2D-x ...所以我使用了這個,它工作得很好:

Texture2D* getTexture2DFromUIImage(UIImage *photo) { 
#warning TODO: Make use of this baby later? Does it work? Do we need to free after malloc? 
    // https://stackoverflow.com/a/15134000/129202 
    Image *imf = new Image(); 
    NSData *imgData = UIImagePNGRepresentation(photo); 
    NSUInteger len = [imgData length]; 
    Byte *byteData = (Byte*)malloc(len); 
    memcpy(byteData, [imgData bytes], len); 
    imf->initWithImageData(byteData,imgData.length); 
    imf->autorelease(); 
    Texture2D* pTexture = new Texture2D(); 
    pTexture->initWithImage(imf); 
    pTexture->autorelease(); 
    return pTexture; 
} 

現在我只是猜測,在該函數的malloc的要真有免費的地方後,它...那是another issue