我只能找到方法来创建Button
:s从基于磁盘的图像文件。 我该如何设置/更改像Texture2D,Image等内存数据中按钮的正常/高亮状态?加载/初始化按钮与内存图像像Texture2D
的Cocos2D-X V3.5
我只能找到方法来创建Button
:s从基于磁盘的图像文件。 我该如何设置/更改像Texture2D,Image等内存数据中按钮的正常/高亮状态?加载/初始化按钮与内存图像像Texture2D
的Cocos2D-X V3.5
更新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。