在Cocos2d-X实现显示菜单的方式比较特殊,首先需要使用CCMenu创建一个菜单,然后使用CCMenuItem创建一个菜单项,实际上程序中显示的菜单是使用CCMenu和CCMenuItemFont共同作用的结果,在Cocos2d-X中CCMenu只是一个容器,需要使用CCMenuItemFont才能实现创建菜单
程序示例:创建一个简单的菜单
程序代码:
#include "Menu.h"
CCScene* Menu::scene()
{
CCScene* scene = CCScene::create();
Menu* layer = Menu::create();
scene->addChild(layer);
return scene;
}
bool Menu::init()
{
//初始化父类层
CCLayer::init();
//得到窗口的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//创建一个Menu(看不到效果,Menu只是一个容器)
CCMenu* menu = CCMenu::create();
//添加Menu
addChild(menu);
//创建一个MenuItem, 默认的Item位置就在中央
CCMenuItemFont* item = CCMenuItemFont::create("This is item");
//将MenuItem增加到Menu上
menu->addChild(item1);
return true;
}
执行结果:
程序示例:创建多个菜单,并且实现菜单响应事件
在Menu.h中添加下面的代码
#ifndef __Menu_H__
#define __Menu_H__
#include "cocos2d.h"
USING_NS_CC;
class Menu : public CCLayer
{
public:
bool init();
static CCScene* scene();
void menuHandler(CCObject*);
CREATE_FUNC(Menu);
};
#endif // __HELLOWORLD_SCENE_H__
在Menu.cpp中添加下面的代码
#include "Menu.h"
CCScene* Menu::scene()
{
CCScene* scene = CCScene::create();
Menu* layer = Menu::create();
scene->addChild(layer);
return scene;
}
bool Menu::init()
{
//初始化父类层
CCLayer::init();
//得到窗口的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//创建一个Menu(看不到效果,Menu只是一个容器)
CCMenu* menu = CCMenu::create();
//添加Menu
addChild(menu);
//创建一个MenuItem, 默认的Item位置就在中央
CCMenuItemFont* item1 = CCMenuItemFont::create("This is item1");
//将MenuItem增加到Menu上
menu->addChild(item1);
//创建一个MenuItem, 默认的Item位置就在中央
CCMenuItemFont* item2 = CCMenuItemFont::create("This is item2");
//添加MenuItem
menu->addChild(item2);
//设置item2的位置
item2->setPositionY(item1->getPositionY() - 100);
//设置响应函数:当触摸到item时调用Menu::menuHandler
//第一个参数:响应函数所在的对象
//第二个参数:成员函数指针
item1->setTarget(this, menu_selector(Menu::menuHandler));
item2->setTarget(this, menu_selector(Menu::menuHandler));
//设置菜单项的ID
//item1的ID为1
//item2的ID为2
item1->setTag(1);
item2->setTag(2);
return true;
}
//响应菜单事件
void Menu::menuHandler(CCObject* obj)
{
//将obj强制转换成菜单项类型
CCMenuItemFont* item = (CCMenuItemFont*)obj;
//得到菜单项的ID
int tag = item->getTag();
//判断用户点击了那个菜单
if(1 == tag)
{
MessageBox(NULL, TEXT("item1 is clicked !"), TEXT("MenuItem响应"), MB_OK);
}
else
{
MessageBox(NULL, TEXT("item2 is clicked !"), TEXT("MenuItem响应"), MB_OK);
}
}
执行结果:
当单击“This is Item1”后:
当单击“This is Item2”后: