cocos2dxでは、CCMenuクラスを利用すれば簡単にボタンが作成できます。 私が今作っているアプリでも使っています。 今回は、このCCMenuクラスを少し深く勉強してみましょう。
selected()
CCMenuItemクラスに、selected()というメソッドがあります。 これを利用すれば、CCMenuクラスの画像が常に選択されたままで表示できます。
[c]
CCMenuItemSprite *item;
item->selected();
[/c]
私はこれでナビゲーションで今いるレイアーのボタンを「選択中」としてわかるように利用しています。
activate()
続きましては、activate()です。 このメソッドを呼び出すと、CCMenuItemクラスで指定されたコールバック関数を呼び出せます。
[c]
CCMenuItemSprite *item;
item->activate();
[/c]
CCMeneItemのタグについて
CCMeneItemクラスとして利用している場合、個別のメニューに関してCCActionを使ってアニメーションさせたい場合、予めタグを割り振っておくと便利です。 [c]
CCMenuItemSprite *item;
item->setTag(1);
[/c]
このようにすれば、後から特定のCCMenuItemクラスを取り出すことができます。
CCMeneItemのタグを使った便利なコールバック関数の使い方
同じようなメニューをたくさん表示させ、ボタンの反応は個別に変えたい。 アイテムの一覧画面などでよく利用されている実装です。
これを先ほどのタグを使ってCCMenuクラスで実現することができます。 [参考 - サウザンドメモリー]
実装方法
まずは、CCMenuを作成します。 たくさんCCMenuItemクラスが必要ですので、for文を使ったほうがいいでしょう。 [c] for (int j = 0; j < 50; j++) {
CCSprite *menuItem1 = CCSprite::createWithSpriteFrameName("MySprite.png");
CCSprite *menuItem2 = CCSprite::createWithSpriteFrameName("MySprite-hover.png");
CCMenuItemSprite *menuSprite = CCMenuItemSprite::create(menuItem1, menuItem2, menuSprite, menu_selector(PerformanceLayer::showWindow));
///////////
///////////
} [/c] ここで注意をしていただきたいのが、CCMenuItemクラスのtargetの所(第3引数)です。 ここにはCCMenuItemクラスを指定して下さい。
タグの設置
個別のCCMenuItemにタグを割り振ります。 [c]
menuSprite->setTag(j);
[/c]
今回は、for文のjを利用しています。
コールバックメソッドを作成
CCMenuクラスは通常通り作成します。 コールバックメソッドは少し工夫が必要です。 [c] void PerformanceLayer::showWindow(CCMenuItemSprite *item){
int menutag = item->getTag();
} [/c]
このようにすれば、同じコールバック関数でも個別にメニューのタグを取り出せます。 このタグを利用して、反応を変えてあげれば良いのです。
注意点
CCMenuItemクラスのtargetを変更したことによって、コールバック関数内では、グローバル変数などが利用できません。 この点注意して下さい。