cocos2d-x 3.0 ラムダ式とstd::function | Androidアプリ屋を目指して

Androidアプリ屋を目指して

Androidアプリ屋を目指して、日々精進ための開発記、兼、日記です
開発に関わることだけでなく、色々なことを記事にしたいと思います
アンドロイドアプリのカテゴリとしては、特にゲームに興味があり

こんばんは!トシたんです。

さて、数ヶ月ぶりにゲーム開発をしている最中ですが、以前はゲーム用のフレームワークとしてlibGDXをしようとしていました。
しかし、これからゲームを作っていくうえでは、「cocos2d-x」を使用したいと思います。
理由としては、いくつかあるのですが、やっぱり決め手となったのは、自分が一番得意な(好きな?)言語であるC++が使えることですね。

現在は、簡単なゲームを作りながらcocos2d-xの勉強をしている最中です。
「15パズル」ってやつを作っています。
まぁ、このゲームについては完成しても公開することはないでしょうw

ところで、cocos2d-xは最新版の3.0を使用しております。
IDEとしてはAndroidでデバックする以外には、VCE2013を使っています。
ここでちょこっとはまったことがあるので備忘として報告しておきます。
※2013.11.24現在では3.0 alphaとあるので、安定版ではないようです。
 今のところ、問題なく動作してますが。

cocos2d-xでボタンを作成するときには、ボタンボタンオブジェクト(MenuItem)の生成時に、ボタンが押下された際に呼び出されるコールバック関数を引数で渡すようになっています。
オブジェクトを生成で使用が推奨されるメソッドの定義は次のようになります。

MenuItem* MenuItem::create(std::function<void()> &f);

これを見たとき自分は
えっ?「std::function<void()>」?ってなに?
ってなりました。

普通に関数のポインタを渡してもコンパイルエラーになります。
ちょっと調べてわかったのは、cocos2d-x 3.0からはどうやら、新しい規格のC++(C++11)に対応しているようです。
あんまり、まだ詳しく調べてないのでわからないのですが、Boostライブラリにあった機能で、C++11に採用された機能のようです。
まぁ、言葉で説明するのもあれなんで、次にコード例を書きます。

std::function<void()> callback = []() {
    // ボタンが押されたときの処理
};
MenuItem* menu = MenuItem::create(callback);

つまり、どういうことかとういうと関数を変数のように扱うことができるということですね。
以前も関数のポインタでも同じようなことができますが、関数のポインタとの大きな違いとしては明示的に宣言した関数でなくても良いということですね。
たとえば、上記と同様に機能するコードは次のようにも書けます。

MenuItem* menu = MenuItem::create(std::function<void()>([]() {
    // ボタンが押されたときの処理
}));

新しいことに無頓着なせいもあり、無知な僕にとってはとても勉強になりました。
アンテナははやり敏感に張っていないといけないですなー。
C++11については、もっと便利な機能とかもありそうなので、体系的に学習しておきたいですね。

今後もcocos2d-xについて、つまずいたことなどがあったら備忘的に記事にしようと思います。