メニュー(Menu)
Copyright (C) 2014 by Nobuhide Tsuda
メニュー(Menu)
- テキストまたは画像のメニューをレイヤーに配置することが出来る。
- 複数のメニューアイテムを切り替えて表示することも可能。
- メニュー項目はハンドラ(コールバック関数)を持ち、選択された時にそれが呼ばれる。
- テキストメニューが押下されると、一時的にテキストが大きく表示されるなどの効果が標準で提供されている。
- メニューの作成は以下の3ステップで行う
- メニューアイテム達を生成
- メニューアイテムからメニューを生成
- レイヤーに配置
メニューアイテム生成
Node
MenuItem // メニューアイテム基底クラス
MenuItemLabel // テキストメニュー
MenuItemFont
MenuItemAtlasFont
MenuItemSprite // スプライトメニュー
MenuItemImage
MenuItemToggle // メニューアイテムのコンテナクラス(メニューアイテムが順次切り替わる)
上記はメニューアイテムクラス階層
メニューアイテムクラスは cocos2d/cocos/2d/CCMenuItem.h で宣言されている
通常、テキストメニューアイテムの生成は MenuItemFont::create() を使用する。
cocos2d::MenuItem* item = cocos2d::MenuItemFont::create(
"Text",
this,
menu_selector(クラス名::ハンドラ名));
cocos2d ネームスペース指定は、「using namespace cocos2d」または「USING_NS_CC」を記述することで省略できる。
MenuItemFont::create() の第1引数は、メニューアイテムに表示するテキスト
第2引数は、ハンドラが実行されるオブジェクトへのポインタ
第3引数は、ハンドラ。menu_selector(クラス名::ハンドラ名) で指定する。
ハンドラは、当然ながら、第2引数で指定したオブジェクトのクラス・メソッドである必要がある。
※ 「ハンドラ」は「コールバック関数」とも呼ばれ、メニューアイテムが選択された時に、実行される関数のこと。
上記以外にもいくつかの生成方法がある。詳細は CCMenuItem.h の class MenuItemFont 宣言部分を参照
クラス名には Font が付いているのに、フォントを指定出来ないのは謎。何故 MenuItemText と命名しなかったのか?
3.1 でビルドを行うと、menu_selector() を使用するのは古い形式だという警告が出る。
以下の様に CC_CALLBACK_1 マクロを使うのが 3.1 では推奨の様だ。
auto item = cocos2d::MenuItemFont::create(
"Text",
CC_CALLBACK_1(クラス名::ハンドラ名, this));
通常、イメージメニューの生成は MenuItemImage::create() を使用する。
cocos2d::MenuItem* item = cocos2d::MenuItemImage::create(
"通常状態画像ファイル名",
"押下状態画像ファイル名",
this,
menu_selector(クラス名::ハンドラ名));
第1、第2引数は、それぞれ 通常状態、押下状態の画像ファイル名を指定する。
第3引数は、ハンドラが実行されるオブジェクトへのポインタ
第4引数は、ハンドラ。menu_selector(クラス名::ハンドラ名) で指定する。
ハンドラは、当然ながら、第3引数で指定したオブジェクトのクラス・メソッドである必要がある。
上記以外にもいくつかの生成方法がある。詳細は CCMenuItem.h の class MenuItemImage 宣言部分を参照
実際のコードでは auto item = MenuItemImage::create(...); と記述することを推奨する。
3.1 でビルドを行うと、menu_selector() を使用するのは古い形式だという警告が出る。
以下の様に CC_CALLBACK_1 マクロを使うのが 3.1 では推奨の様だ。
auto item = cocos2d::MenuItemImage::create(
"通常状態画像ファイル名",
"押下状態画像ファイル名",
CC_CALLBACK_1(クラス名::ハンドラ名, this));
MenuItemToggle はメニューアイテムのコンテナクラスで、複数のメニューアイテムを一つにまとめたもの。
メニューアイテム item1, item2, item3 を生成;
auto itemToggle = cocos2d::MenuItemToggle::create(item1);
itemToggle->addSumItem(item2);
itemToggle->addSumItem(item3);
最初は item1 が表示される。item1 が選択されると item2 に切り替わる。item2 が選択されると item3 に切り替わる
最後のアイテムが選択されると最初のアイテムに戻る。
「BGM OFF」、「BGM ON」などのように、押す度にメニューを切り替えたいときに使用する。
メニュー生成
- メニューアイテムを1つ以上生成したら、それを Menu に登録
- メニューアイテムの個数は可変。
- 最後に NULL を指定しておく。
- メニューアイテムが複数ある場合は、menu->alignItemsVertically(); を呼ばないと重なってしまうようだ。
auto item1 = MenuItemFont::create(...);
auto item2 = MenuItemImage::create(...);
auto menu = cocos2d::Menu::create(item1, item2, NULL);
menu->alignItemsVertically();
メニュー配置
- 生成した Menu を Layer に addChild() したら、メニューの出来上がり
menu->setPosition(位置);
addChild(menu);
位置は Vec2 で指定する。
その他