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应该在它之后的某个地方有一个空闲空间。。。但那是我的错