Cocos2d x 带有内存图像(如Texture2D)的Load/init按钮

Cocos2d x 带有内存图像(如Texture2D)的Load/init按钮,cocos2d-x,Cocos2d X,我只能找到从基于磁盘的图像文件创建按钮的方法。 如何从内存中的数据(如纹理2D、图像等)设置/更改按钮的正常/突出显示状态 Cocos2D-x v3.5更新20160408: 我又在谷歌上搜索了一下,谷歌推荐了这个页面。。。我要感谢我过去的自己:-) 这次我编写了一个方便的工具函数: void Mjcocoshelper::rendernodetospriteframecache(Node* node, std::string nameincache) { const Size SIZE

我只能找到从基于磁盘的图像文件创建
按钮的方法。
如何从内存中的数据(如纹理2D、图像等)设置/更改按钮的正常/突出显示状态


Cocos2D-x v3.5

更新20160408: 我又在谷歌上搜索了一下,谷歌推荐了这个页面。。。我要感谢我过去的自己:-) 这次我编写了一个方便的工具函数:

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);
因此,它将动态地将spriteframe添加到sprite帧缓存中。我们必须确保存储它们的名称不会覆盖任何其他内容,我们还必须为添加到缓存中的每个图像不断创建新名称。在一些极端悲伤的场合,这可能会覆盖一些现有的图像,所以我会给它一些更多的思考。。。大概有时

奖金: 我有一个我之前创建的ObjC框架,可以从远程服务器获取图像。。。嗯,现在我重新使用它,并且还需要转换uiMIG:S框架最终结束,我可以传递给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应该在它之后的某个地方有一个空闲空间。。。但那是我的错