cocos2dx-3.0(11)------Menu与他的小弟MenuItems的故事

时间:2023-02-08 17:59:35

 ~~~~我的生活,我的点点滴滴!!


                      先看看Menu的继承关系图                                在来看MenuItem的继承关系图

                                       cocos2dx-3.0(11)------Menu与他的小弟MenuItems的故事                                     cocos2dx-3.0(11)------Menu与他的小弟MenuItems的故事

前面说过,Menu就是一个cocos2dx为我们提供的定制的层,这样看来他们其实没有太多的交集,但是MenuItems(注意是带有s复数的)他们必须依赖于Menu然后在加载到layer上,不然他们不会响应触摸的,Menu已经帮我们处理好了,我们就开心的用嘛

Menu仅仅是一个MenuItems的集合,这些菜单项作为菜单的一部分,定义了各种按钮或标签。由于Menu包含所有的菜单项,所以它控制这些菜单项的对齐方式和位置。在默认情况下,所有的菜单项被放置在Menu的中心。 Menu包含如下特点:

1. 可以在运行时使用addChild,将MenuItem对象到Menu。
2. Menu只接受MenuItem对象作为children。


在cocos2d-x中创建一个菜单很容易
1.创建一个新的场景(继承自Scene)
2.创建一个MenuItem

MenuItem *pCloseItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
加入到菜单

Menu* pMenu = Menu::create(pCloseItem, NULL);
加入到场景

this->ddChild(pMenu, 1);
对菜单对象增加一个回调方法

void HelloWorld::menuCloseCallback(Ref* pSender)
{
        Director::getInstance()->end();
}
这就是所有的了,你可以在你的游戏中使用这个菜单了。

大家看到上面那个MenuItem继承图,他下面还有好多小弟了,下面我们来随便说说他们, 在cocos2dx中,我们有5中菜单项可以选择。它们分别是:MenuItemFont(字体菜单项)、MenuItemImage(图片菜单项)、MenuItemLabel(文本菜单项)、MenuItemSprite(精灵菜单项)、MenuItemToggle(开关菜单项)。下面我们就开始来学习他们的用法吧。

1.MenuItemFont(字体菜单项)
方法1:
       MenuItemFont::create(选项文字,触发目标对象,触发目标函数);
方法2:
       MenuItemFont::create(选项文字);


2.MenuItemImage(图片菜单项)
方法1:
       MenuItemImage::create(默认显示的图片,点击时显示的图片,触发目标对象,触发目标函数);


3.MenuItemLabel(文本菜单项)
方法1:
       MenuItemLabel::create(LableTTF对象,触发目标对象,触发目标函数);


4.MenuItemSprite(精灵菜单项)
方法1:
       MenuItemSprite::create(默认显示的精灵对象,选中时显示的精灵对象,触发目标对象,触发目标函数);


5.MenuItemToggle(开关菜单项)
方法1:
       MenuItemToggle::createWithTarget(触发目标对象,触发目标函数,MenuItem对象的可变参数列表);


//背景
	auto bg = Sprite::create("background.png");
	bg->setPosition(Point(visibleSize.width/2, visibleSize.height/2));
	this->addChild(bg, 0);

	//image
	auto menuItem_1 = MenuItemImage::create("font1.png", "font2.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
	menuItem_1->setPosition(Point(visibleSize.width/2, visibleSize.height - 60));

	//ttf
	std::string ttfStr = "文本菜单";
	GbkToUtf8(ttfStr, "GB2312", "UTF-8");
	auto ttf_2 = LabelTTF::create(ttfStr.c_str(), "Helvetica", 24);
	auto menuItem_2 = MenuItemLabel::create(ttf_2, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
	menuItem_2->setPosition(Point(visibleSize.width/2, visibleSize.height - 120));

	//font
	std::string fontStr = "文字菜单";
	GbkToUtf8(fontStr, "GB2312", "UTF-8");
	auto menuItem_3 = MenuItemFont::create(fontStr, CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
	menuItem_3->setPosition(Point(visibleSize.width/2, visibleSize.height - 180));

	//toggle
	std::string toggleStr_1 = "开";
	GbkToUtf8(toggleStr_1, "GB2312", "UTF-8");
	auto font_1 = MenuItemFont::create(toggleStr_1.c_str());
	std::string toggleStr_2 = "关";
	GbkToUtf8(toggleStr_2, "GB2312", "UTF-8");
	auto font_2 = MenuItemFont::create(toggleStr_2.c_str());
	auto menuItem_4 = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuCloseCallback,this), font_1, font_2, NULL);
	menuItem_4->setPosition(Point(visibleSize.width/2, visibleSize.height - 240));

	//精灵的不创建了根Image的类似

	auto menu = Menu::create(menuItem_1, menuItem_2, menuItem_3, menuItem_4, NULL);
	menu->setPosition(Point::ZERO);
	this->addChild(menu, 1);

效果图如下,不要在意那第一个的效果,我随便弄的一个图片

cocos2dx-3.0(11)------Menu与他的小弟MenuItems的故事