cocos2dx 3.3がリリースされてsaveToFileにcallbackが追加された。
http://www.cocos2d-x.org/news/387
・RenderTexture: add a callback function for saveToFile()`
いままではsaveToFileがいつ終わっているのかわからないかったので、runActionでDelayTimeしていた。
tests/cpp-testも同じようにDelayTimeしていたからこれしか方法がなかったと信じている。
callbackが追加されたことでDelayTimeで1秒とか根拠のない値を設定しないですむ。
GameScene.h
#ifndef __GAME_SCENE_H__
#define __GAME_SCENE_H__
#include "cocos2d.h"
#include "extensions/cocos-ext.h"
#include "ui/CocosGUI.h"
#include "ProtocolShare.h"
class GameScene : public cocos2d::Layer
, public cocos2d::plugin::ShareResultListener
{
protected:
cocos2d::RenderTexture* mTexture;
cocos2d::plugin::ProtocolShare* mTwitter;
public:
static cocos2d::Scene* createScene();
GameScene();
virtual ~GameScene();
virtual bool init();
virtual void onShareResult(cocos2d::plugin::ShareResultCode, const char*);
void tweet(cocos2d::Ref*, cocos2d::extension::Control::EventType);
CREATE_FUNC(GameScene);
};
#endif
GameScene.cpp
#include "GameScene.h"
#include "PluginManager.h"
Scene* GameScene::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = GameScene::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
GameScene::GameScene()
: mTwitter(nullptr)
, mTexture(nullptr)
{
}
GameScene::~GameScene()
{
if(nullptr != mTwitter) {
plugin::PluginManager::getInstance()->unloadPlugin("ShareTwitter");
mTwitter = nullptr;
}
if(nullptr != mTexture) {
mTexture->release();
Director::getInstance()->getTextureCache()->removeUnusedTextures();
}
}
bool GameScene::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto btn = ControlButton::create(Scale9Sprite::createWithSpriteFrameName("btn_tweet.png"));
btn->setAdjustBackgroundImage(false);
btn->setAnchorPoint(Vec2::ZERO);
btn->setPosition(Vec2::ZERO);
btn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameScene::tweet), Control::EventType::TOUCH_DOWN);
this->addChild(btn);
mTwitter = dynamic_cast<plugin::ProtocolShare*>(plugin::PluginManager::getInstance()->loadPlugin("ShareTwitter"));
plugin::TShareDeveloperInfo pTwitterInfo;
pTwitterInfo["TwitterKey"] = TWEET_KEY;
pTwitterInfo["TwitterSecret"] = TWEET_SECRET;
#if defined(COCOS2D_DEBUG)
mTwitter->setDebugMode(true);
#endif
mTwitter->configDeveloperInfo(pTwitterInfo);
mTwitter->setResultListener(this);
mTexture = RenderTexture::create(visibleSize.width, visibleSize.height);
mTexture->retain();
mTexture->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
return true;
}
void GameScene::tweet(Ref* pSender, Control::EventType type)
{
auto btn = static_cast<ControlButton*>(pSender);
btn->setEnabled(false);
mTexture->clear(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1());
mTexture->begin();
Director::getInstance()->getRunningScene()->visit();
mTexture->end();
// コールバック追加されたやったー!!
mTexture->saveToFile("a.png", Image::Format::PNG, true, [&](RenderTexture* rt, const std::string& path) {
plugin::TShareInfo pInfo;
pInfo["SharedText"] = "tweet msg";
pInfo["SharedImagePath"] = path;
mTwitter->share(pInfo);
btn->setEnabled(true);
});
/*ちなみにいままではこう書いていた
if(mTexture->saveToFile("a.png")) {
this->runAction(Sequence::create(
DelayTime::create(1.0f),
CallFunc::create([this](){
btn->setEnabled(true);
plugin::TShareInfo pInfo;
pInfo["SharedText"] = "tweet msg";
pInfo["SharedImagePath"] = FileUtils::getInstance()->getWritablePath().append("a.png");
mTwitter->share(pInfo);
}),
nullptr));
}
*/
}
void GameScene::onShareResult(plugin::ShareResultCode ret, const char* msg)
{
if(ret == plugin::kShareSuccess) {
MessageBox(msg, "success");
}
}
こんな感じでかけるようになる。
うれしい。