Help us understand the problem. What is going on with this article?

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

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

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

うれしい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした