准备工作
首先创建一个Cocos2DX-win32应用程序,项目名称未MenuDemo并取消Box2D和声音的支持,如下图:
点击“Finish”有运行一下项目,如下图没有问题
(windows下配置见 http://www.cnblogs.com/BlueBeauty/p/3687542.html 和http://www.cnblogs.com/BlueBeauty/p/3690409.html)
图片菜单使用
为了便于观察,我将背景和“HelloWorld”注释掉。其实在新创建的项目中已经有了一个菜单就是右下角关闭菜单。我们再添加一个Play菜单。首先看看CCMenuItemImage创建菜单函数的原型 static CCMenuItemImage* create(const char *normalImage, const char *selectedImage, CCObject* target, SEL_MenuHandler selector)。前两个参数是普通状态和选择状态的图片名称,最后一个参数是一个函数指针,也就是点这个菜单要做的事情。首先选择两张图片拷贝到项目目录的Resources下,然后在HelloWorldScene.cpp文件的init方法中添加如下代码
CCMenuItemImage *pPlay = CCMenuItemImage::create( "btn-play-normal.png", "btn-play-selected.png", this, menu_selector(HelloWorld::menuCloseCallback) ); pPlay->setPosition(ccp(0,0)); CCMenu* pMenu = CCMenu::create(pCloseItem,pPlay, NULL); // CCMenu* pMenu = CCMenu::create(pCloseItem, NULL)
保存运行项目,如图:
我们看到图片菜单出现在了窗口的左下方但又没显示完整。为了把图片显示完整,再来修改一个菜单的位置pPlay->setPosition(ccp(125/2,42/2)) (图片大小为125,42)如上图。由此我们可以确定引擎将显示区域的左下角顶为原点;setPosition函数设置的是元素的中心点在现实区域的位置。那如何才能将菜单放在正中间呢,这样做还要用到一个来自CCDirector类getWinSize的函数。这个函数的名称期初让我一些迷惑,以为获取的大小包含了窗体的标题栏和边框,其实不然该函数返回的大小就是现实区域的大小。小伙们下断跟踪一下就知道了。
好了,这个菜单就还差自己的回调函数,其实不难就不写了记得在头文件中实现声明哦。
文本菜单使用
下面再学一下文本菜单的使用,文本标签菜单的使用需要提供一个文本标签,还是看看函数声明
static CCMenuItemLabel * create(CCNode*label, CCObject* target, SEL_MenuHandler selector);
首先添加一个回调函数,如下:
HelloWorldScene.h
class HelloWorld : public cocos2d::CCLayer { public: virtual bool init(); static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); void menuPlayCallback(CCObject* pSender); void menuPlayLabelCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); }; HelloWorldScene.cpp
void HelloWorld::menuPlayLabelCallback(CCObject* pSender) { CCLOG("menuPlayLabelCallback"); }
修改init方法
CCMenuItemImage *pPlay = CCMenuItemImage::create( "btn-play-normal.png", "btn-play-selected.png", this, menu_selector(HelloWorld::menuPlayCallback) ); pPlay->setPosition(ccp(size.width/2,size.height/2)); //新加的 CCLabelTTF* pLabel = CCLabelTTF::create("Label Menu Demo","Arial",30); CCMenuItemLabel* pMenuLabel = CCMenuItemLabel::create( pLabel,this,menu_selector(HelloWorld::menuPlayLabelCallback)); pMenuLabel->setPosition( ccp(size.width/2,size.height/2-42) ); CCMenu* pMenu = CCMenu::create(pCloseItem,pPlay,pMenuLabel, NULL);
F5看看效果吧