我只能找到方法來創建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。