Edited at

cocos2dx twitterにスクリーンショット画像を投稿する

More than 3 years have passed since last update.

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");
}
}


こんな感じでかけるようになる。

うれしい。