【cocos2dx C++】コールバック関数を実装する

今回は、cocos2dxでも利用できる、とても便利な「コールバック関数」についてブログに書いていきたいと思います。これを利用すれば、色々なタイミングで特定の処理ができるようになります。是非参考にしてみてください。

コールバック関数を実装する

「コールバック関数」を利用する前、親オブジェクトと子オブジェクトで色々なやり取りをする際には、以下の様な形でコードを実装していました。

  • タグを利用する
  • getPrent()を利用する
  • getRunningScene()を利用する

[c] //親オブジェクトの場合 auto childSprite = (Sprite*)this->getChildByTag(100); if(childSprite){

childSprite = setVisible(false);

}

//子オブジェクトの場合 auto parentLayer = (Layer*)this->getParent(); if(parentLayer){

}

//子オブジェクトの場合2 auto scene = Director::getInstance()->getRunningScene(); auto parentLayer = (Sprite*)this->getChildByTag(101); if(parentLayer){

} [/c]

特にこの方法でも問題ないのですが、自作のクラスを利用する場合には専用のメソッドなり変数なりを準備する必要があるのが少し面倒くさいとと思っていました。

コールバック関数

これは1個前のブログのエントリーで書いた「文字を一文字づつ表示する」際に、参考にさせていただいたコードがありました。

その中に「コールバック関数」が実装されていてました。 [c] //ヘッダー

public: void setCallback( const std::function<void(cocos2d::Ref*)> &callback );

protected: std::function<void(Ref*)> m_callback;

//cpp

void ChildSpriteClass::setCallback(const std::function &callback) { m_callback = callback; }

if (m_callback) m_callback(this);

[/c]

利用方法

まずは、親オブジェクトに「コールバック関数」を受け取けとるラムダ関数を作成します。 [c]

auto childSprite = (ChildSpriteClass*)this->getChildByTag(100);

childSprite->setCallback({

    // コールバックの処理記述

});

[/c]

次にコールバックを送るタイミングを、子オブジェクトに実装します。 [c]

void ChildSpriteClass::pushButtonAction(){

 //変数に値を格納した時に、コールバック関数が動く
 if (m_callback) m_callback(this);

}

[/c] これで完了です。 ラムダ関数を最初に記述をしておくだけで、いちいち子オブジェクトを呼びださなくても色々な処理ができるようになります。

std::function

この「コールバック関数」で利用するのが[std::function]です。 色々調べたのですが、すごく解説が難しくて、どのようなものか余り理解できませんでした。

引数

この「コールバック関数」には引数が指定できます。 これも非常に便利ですね。 [c]

//例,int型 void setCallback(const std::function<void( int )> &callback );

[/c]

最後に

今回はcocos2dxというよりは[C++]の知識が必要な実装でした。 これを考えると、今とても苦労している実装が[C++]では、実は簡単でした、パターンが結構あるような感じがします。これからレベルアップをするためには、[C++]も勉強をしないといけませんね。

C++ ポケットリファレンスC++ ポケットリファレンス
高橋 晶,安藤 敏彦,一戸 優介,楠田 真矢,道化師,湯朝 剛介

技術評論社
売り上げランキング : 46955

Amazonで詳しく見る