【Cocos2dx】菜单

Cocos2dx的菜单在《【Cocos2dx】用当前游戏状态作为暂停背景、纯文字纯图片按钮与不间断的重复动作序列》(点击打开链接)中开发按钮的时候,已经使用过了。只是当时使用菜单的时候,只在菜单中添加了一个菜单子项,看起来仅仅是一个按钮的效果,无法体会到Cocos2dx的菜单是什么使用的。

其实Cocos2dx的菜单使用依次简单。

比如如下例子:


这是在手游中非常常见的菜单。为了测试各个按钮的响应,还在这个菜单上方定义一个文本,点击不同的菜单子项则会将此文本改变成相应的函数。

使用CCMenuItemLabel或者CCMenuItemImage加上CCMenu去实现即可。

首先在HelloWorldScene.h做如下的声明:

#include "cocos2d.h"
USING_NS_CC;//一旦在头文件声明用到了CC,就必须有这句
class HelloWorld:public cocos2d::CCLayer
{
public:
	virtual bool init();
	static cocos2d::CCScene* scene();
	CREATE_FUNC(HelloWorld);
private:
	CCLabelTTF *label;//点击响应文字
	//菜单子项文字
	CCLabelTTF *label1;
	CCLabelTTF *label2;
	CCLabelTTF *label3;
	//各个按钮的响应事件
	void button1_onclick(CCObject* pSender);
	void button2_onclick(CCObject* pSender);
	void button3_onclick(CCObject* pSender);
};

之后,在HelloWorldScene.cpp的核心代码如下:
#include "HelloWorldScene.h"

CCScene* HelloWorld::scene()
{
	CCScene *scene = CCScene::create();
	HelloWorld *layer = HelloWorld::create();
	scene->addChild(layer);
	return scene;
}

bool HelloWorld::init()
{
	CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取尺寸

	//各个菜单子项
	label1=CCLabelTTF::create("button1","Arial",24);
	CCMenuItemLabel *menu_item_label1=CCMenuItemLabel::create(label1,this,menu_selector(HelloWorld::button1_onclick)); 
	label2=CCLabelTTF::create("button2",24);
	CCMenuItemLabel *menu_item_label2=CCMenuItemLabel::create(label2,menu_selector(HelloWorld::button2_onclick));  
	label3=CCLabelTTF::create("button3",24);
	CCMenuItemLabel *menu_item_label3=CCMenuItemLabel::create(label3,menu_selector(HelloWorld::button3_onclick));  

	int heightItem=menu_item_label1->getContentSize().height;//求菜单子项的高度

	//设置所有菜单子项的坐标(相对于CCMenu的相对坐标)
	menu_item_label1->setPosition(ccp(0,0));
	menu_item_label2->setPosition(ccp(0,-heightItem));
	menu_item_label3->setPosition(ccp(0,-heightItem*2));

	CCMenu* menu1=CCMenu::create(menu_item_label1,menu_item_label2,menu_item_label3,NULL);//将各个菜单子项加到菜单上面去
	menu1->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));//菜单的定位
	this->addChild(menu1);

	label=CCLabelTTF::create("0",24);//设定相应文本的位置
	label->setPosition(ccp(visibleSize.width/2,visibleSize.height/2+heightItem));//放在菜单的上方
	this->addChild(label);	

	return true;
}

//各个菜单子项的回调函数
void HelloWorld::button1_onclick(CCObject* pSender){
	label->setString("1");
}

void HelloWorld::button2_onclick(CCObject* pSender){
	label->setString("2");
}

void HelloWorld::button3_onclick(CCObject* pSender){
	label->setString("3");
}

可能各位看完上面的代码,对菜单子项的布局与菜单的关系有点困惑,具体,关于菜单子项CCMenuItemLabel的setPosition是相对于菜单的位置而言的,是这个菜单子项对于菜单偏离多少位置,而不是这个菜单子项在场景的绝对位置。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...