cocos2d-x-3.0学习笔记之如何添加菜单按钮

在游戏开发的过程中,一个非常常见的功能是我们应该给游戏设计一些菜单选项,包括游戏开始,游戏结束等等一些的菜单按钮。
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(...)
}

至此一个简单的菜单就完成了,每天进步一点点,终将会成功!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值