この記事は
cocos2d-x Advent Calendar1日目の記事です。
cocos2d-x Advent Calendar 2015 - Qiita
誰も立ててないので立ててみましたが、今年は参加者が少なく、炎上気味なのでご興味のある方はぜひ参加してみてください。
QiitaのAdvent Calendarなので、Qiitaで書いた方が見やすいかと思ったのですが、自分の作った物を発信する場としてはQiitaは不適だと思い、ブログに書くことにしました。
ソーシャル連携用のプラグイン作った
今回はCCSocialShareというcocos2d-xから簡単にTwitter/Facebookに投稿できるプラグインを作ってみたのでご紹介します。
cocos2d-xでTwitterやFacebookにスクリーンショットなどを投稿したい!という需要は高いはずだけど、どうにも共通化された上手い仕組みが見つからない。
cocos2d-xが公式で提供されているplugin-xというプラグインで、ソーシャル連携機能が提供されているけれど、組み込み方が煩雑だったり、OS標準の機能を使っていないため、使い勝手が悪い感じでした。
plugin-xでは、認証に独自の機構を使っていて、いちいちoAuth認証をしないといけなかったりで非常に面倒。iOSの場合は標準の仕組みを使いたい!
というわけで、以前リリースした 『Wave Weaver』 などに使っていたコードを切り出して汎化してみた。
「究極」っていうのは若干誇張が入っているけど、言った物勝ちだと思ってる。
使い方
#include "CCSocialManager.h" void onShareButtonTapped() { if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) { CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "I beat this game!", path.c_str(), [](CCSocialShare::PostResult result) { if (result == CCSocialShare::PostResult::SUCCEED) { // When to post is succeed log("Done"); } else if (result == CCSocialShare::PostResult::CANCELED) { // When to post is canceled log("Canceled"); } }); } }
こんな感じでSocialManager::postMessage
を呼べばiOS/Androidから簡単に使える。渡す引数によってTwitter/Facebookに対応している。
iOSの場合、このように標準の共有機能が立ち上がるため、既に設定されていれば即座につぶやける。
Androidはインテントを使って、Twitter/Facebookアプリを起動できるため、こちらも認証不要。
コールバックにも対応しているため、ラムダ式を渡すと、投稿したり、キャンセルした後になんらかの処理をさせることもできる。(iOSのみ)
ファイルパスを渡せば画像添付も行える。例えば単純にスクリーンショットを共有するだけなら以下の通り。
#include "CCSocialManager.h" void onShareButtonTapped() { if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) { Size size = Director::getInstance()->getWinSize(); RenderTexture* texture = RenderTexture::create((int)size.width, (int)size.height); texture->setPosition(Point(size.width / 2, size.height / 2)); texture->begin(); Director::getInstance()->getRunningScene()->visit(); texture->end(); texture->saveToFile("screenshot.png", Image::Format::PNG, true, [&](RenderTexture* rt, const std::string& path) { CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "I beat this game!", path.c_str(), [](CCSocialShare::PostResult result) { if (result == CCSocialShare::PostResult::SUCCEED) { // When to post is succeed log("Done"); } else if (result == CCSocialShare::PostResult::CANCELED) { // When to post is canceled log("Canceled"); } }); }); } }
敢えて画像を縮小する機能などは実装していない。実際にこのようにしてスクリーンショットを添付してしまうと大きすぎるので、必要に応じて縮小すると良いと思う。
組み込み方法
https://github.com/giginet/CCSocialShare/blob/master/README.md#how-to-integrate
iOS/Androidへの組み込み方法は上記のREADMEに書いてあるので、この通りに組み込めば良いと思う。
iOS
iOSはSocialManager.{h,mm}
とSocial.framework
をプロジェクトに読ませれば簡単に使える。便利。
Android
AndroidはAndroid Studio + Gradleを用いてビルドするように設計している。
静的ライブラリをビルドするためのAndroid.mk
と、Androidアプリ側に組み込むためのbuild.gradle
両方の更新が必要で、ビルドもそれぞれ行わないといけないため、iOSに比べて煩雑になっている。
旧来のAntを使ったビルドのドキュメントは書いていないけど、上手い感じにやればビルドできると思う。
今後
Androidでのコールバック対応
現在、Android版ではコールバックを呼ぶ機構に対応していない。実装の目処は付いたが、以下のような理由で障害が多くて実装されていない。
JNIからC++の関数ポインタを叩くのが大変
良い方法が見つからなかった。JNI力が低い。
インテント終了のコールバック時の設計
インテントが終了したことの検知はActivityでやるのが一般的なようで、組み込む際にCocos2dxActivity
を書き換える必要が出てきて、組み込みの手間が増えてしまう。
Android版の実装には旧来のインテントの仕組みを用いているんだけど、例えばSupport LibraryのShareCompatなどを利用すればさらにスマートに実装できるかもしれない。
Android+JNI力が高い方からのPull Requestお待ちしています 🙏
CIしたい
Android/iOSクロスプラットフォームで確認するのが大変面倒だったのでCI環境を整備したい感じ。
cocos2d-xをsubmoduleとして読んできてデモアプリをビルドする感じが良いかなあと考えています。
どうぞご利用ください
以下から導入できます!!!
インターフェイスなどは予告なく変更される可能性があります。
cocos2d-xでゲームを作りたい方は
拙著ではございますが、ぜひこちらの本で入門しましょう。
併せてAdvent Calendarにも参加いただけると幸いです。
そろそろ発売から1年が経つんですね。
ついでにゲームもよろしく
最近新作が出せていないのですが、以前出したゲームを貼っておきます。ご興味のある方はぜひ。
https://itunes.apple.com/jp/app/wave-weaver/id841280819?mt=8&uo=4&at=10l8JW&ct=hatenablog