2015年05月17日

cocos2d-xでTwitter投稿

今週はTwitter機能を実装していたのでメモ。一番手間が少なそうな標準のツイート投稿ビューを表示する方法です。ちなみに、調べている途中でPlugin-Xというネイティブコード連携のための仕組みがあることに気付きましたが、今回は面倒なので普通に作ることにしました。

なお、スクリーンショットをツイートするところは【cocos2dx】ソーシャルメディアへの「スクリーンショット」を工夫するを参考にしました。

まずはRootViewControllerにTwitterの投稿ビューを表示する関数を追加。

- (void)postTwitterMessage:(NSString *)message URL:(NSURL *)url Image:(UIImage *)image
{
    // Twitterが使用可能な場合のみ処理を行う
    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {

        // Twitter投稿ビューを作成する
        SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

        // 完了時のハンドラを設定する
        [composeVC setCompletionHandler:^(SLComposeViewControllerResult result) {

            // Twitter投稿ビューを閉じる
            [self dismissViewControllerAnimated:YES completion:nil];

        }];

        // 投稿するテキストの初期設定を行う
        [composeVC setInitialText:message];

        // 投稿するURLの設定を行う
        if (url != nil) {
            [composeVC addURL:url];
        }

        // 投稿する画像の設定を行う
        if (image != nil) {
            [composeVC addImage:image];
        }

        // Twitter投稿ビューを表示する
        [self presentViewController:composeVC animated:YES completion:nil];
    }
}

次にC++からネイティブコードを呼び出すためのクラスを作成。今回はそのままTwitterというクラス名にしました。

void Twitter::post(const char *message, const char *url, const char *imagepath)
{
    // RootViewControllerを取得する
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    if (window == nil) {
        window = [[UIApplication sharedApplication].windows objectAtIndex:0];
    }

    // RootViewControllerであることを確認する
    if ([window.rootViewController isKindOfClass:[RootViewController class]]) {

        // RootViewControllerにキャストする
        RootViewController *rootViewController = (RootViewController *)window.rootViewController;

        // 投稿画像を開く
        UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithCString:imagepath encoding:NSUTF8StringEncoding]];

        // ネイティブコードのTwitter投稿ビュー表示処理を呼び出す
        [rootViewController postTwitterMessage:[NSString stringWithCString:message encoding:NSUTF8StringEncoding]
                                           URL:[NSURL URLWithString:[NSString stringWithCString:url encoding:NSUTF8StringEncoding]]
                                         Image:image];            
    }
}

最後にSceneからスクリーンショットを保存する処理と上のツイート投稿関数を呼び出す処理を作成します。

最新のcocos2d-xならスクリーンショットを保存するためのRenderTexture::saveToFile()にコールバック関数を渡すことができるので、保存が終了した後にツイートの処理ができるのですが、私が今使っているバージョンが3.1と古いもののため画像保存終了のタイミングがわかりません。

幸い、今回のアプリではツイートはゲームオーバー時にしかできず、ゲームオーバーになってからゲームオーバー画面が出るまでに若干ラグを設けているので、ゲームオーバーになった瞬間にスクリーンショットを撮ることで解決しました。本来は最新版を使うべきなんでしょうが。

とりあえずスクリーンショットを撮る処理。なおwidthheightCCDirector::getInstance()->getVisibleSize()で取得した値です。

// スクリーンショット用テクスチャを作成する
RenderTexture *texture = RenderTexture::create(width, height);
texture->setPosition(cocos2d::Vector2(width / 2, height / 2));

// スクリーンショットを撮り始める
texture->begin();

// 画面の描画
this->visit();

// スクリーンショットを撮り終える
texture->end();

// スクリーンショットを保存する
texture->saveToFile("screenshot.png", cocos2d::Image::Format::PNG);

最後にツイートボタンを押された時の処理を作成して終わりです。

// スクリーンショットの保存先パスを作成する
std::string fullpath = FileUtils::getInstance()->getWritablePath() + "screenshot.png";

// ツイートビューを表示する
Twitter::post("ツイート内容", "アプリのURL", fullpath.c_str());
ラベル:とりとま cocos2d
posted by かねだ at 23:01| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。