2015-06-04 27 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