加载/初始化按钮,内存图像,如Texture2D

时间:2015-06-04 10:23:40

标签: cocos2d-x

我只能找到从基于磁盘的图像文件创建expandtab:s的方法。 如何从内存数据(如Texture2D,Image等)设置/更改按钮的正常/突出显示状态?

Cocos2D-x v3.5

1 个答案:

答案 0 :(得分: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);

所以它做了什么,它动态地将精灵帧添加到精灵帧缓存。我们必须确保我们存储的名称不会覆盖任何其他内容,我们还必须为我们添加到缓存中的每个图像创建新名称。在一些极端悲伤的场合,这可能会覆盖一些现有的图像,所以我会更加谨慎......也许......有时... ...

加成: 我确实有一个我之前创建的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