在游戏开发的过程中,一个非常常见的功能是我们应该给游戏设计一些菜单选项,包括游戏开始,游戏结束等等一些的菜单按钮。
cocos为我们提供了一个类MenuItemImage专门用来实现这些功能,MenuItemImage类的构造函数如下:
static MenuItemImage* create(const std::string& normalImage, const std::string& selectedImage, Ref* target, SEL_MenuHandler selector);
这个构造函数允许用两张图片(一张为选中之前,一张为选中之后)来创建一个按钮,第三个参数为要添加的地方,最后一个参数为要传入的回调函数地址(回调函数名)。
首先利用图片资源我们创建开始、退出、设置等三个菜单选项
auto itemStart = MenuItemImage::create("startNomal.png", "startSelected.png",this,menu_selector(LayerStart::Start));
auto itemQuit = MenuItemImage::create("quitNormal.png", "quitSelected.png", this, menu_selector(LayerStart::Quit));
auto itemSetting = MenuItemImage::create("settingNormal.png", "settingSelected.png", this, menu_selector(LayerStart::Setting));
创建好这三个菜单按钮之后,要将菜单按钮添加到菜单上,利用
Menu类的构造函数Menu * Menu::create(MenuItem* item, …);这个构造函数利用菜单按钮创建一个菜单,代码如下:
//创建3个菜单,以NULL结束
auto menu = Menu::create(itemStart, itemQuit, itemSetting, itemAbout, NULL);
//将菜单添加到当前Layer
this->addChild(menu);
//给菜单设置竖直排列的风格
menu->alignItemsVertically();
此时菜单已经创建完毕,但是因为我们未给菜单设置位置属性,因此菜单的位置可能不是我们想要的,下面为其设置位置属性:
//从menu中取出菜单按钮,并保存到一个Vector容器当中
Vector<Node *>items = menu->getChildren();
//STL迭代器使用
//遍历容器
for (Vector<Node *>::iterator it = items.begin(); it < items.end();it++)
{
//设置菜单按钮的位置
*it->setPosition(Point(a,b));
}
设置好菜单之后就要给菜单选项添加处理函数了
cocos为我们定义了如下这些回调函数格式供我们选择
typedef void (Ref::*SEL_CallFunc)();
typedef void (Ref::*SEL_CallFuncN)(Node*);
typedef void (Ref::*SEL_CallFuncND)(Node*, void*);
typedef void (Ref::*SEL_CallFuncO)(Ref*);
typedef void (Ref::*SEL_MenuHandler)(Ref*);
typedef void (Ref::*SEL_SCHEDULE)(float);
#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)
#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)
#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
菜单的处理函数为menu_selector,因此我们需要添加void (Ref::SEL_MenuHandler)(Ref)这种格式的处理函数
void LayerStart::Start(Ref*)
{
//切换游戏场景
CCDirector::sharedDirector()->replaceScene(...)
}
void LayerStart::Quit(Ref*)
{
//退出游戏
exit(0);
}
void LayerStart::Setting(Ref*)
{
//切换设置页面
CCDirector::sharedDirector()->replaceScene(...)
}
至此一个简单的菜单就完成了,每天进步一点点,终将会成功!