1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)



CCMenu

  1. 基本结构

    CCMenu继承自CCLayer,本质是一个容器。需要被addChild到父类中去。

    CCMenuItem是菜单项,它有如下子类:

CCMenuItemFont;CCMenuItemImage;CCMenuItemLabel;CCMenuItemSprite;CCMenuItemToggle;

是真正的需要实例化的菜单项。需要addChild到CCMenu对象中去。

示例:

CCMenuItem * item = CCMenuItemFont::create(“Start”);

//这里的this表示的是调用者

Item->setTarget(this,menu_selector(MYMenu::menuCallBack));

CCMenu * menu = CCMenu::create();

menu->addChild(item);

addChild(menu);

  1. CCMenuItem


CCMenuItemFont

CCMenuItem * font = CCMenuItemFont::create(“Start”,this,menu_selector(MYMenu::menuCallBack));

CCMenu * menu = CCMenu::create();

menu->addChild(item);

addChild(menu);

第一个参数为标签要显示的文字,第二个参数表示回调函数的调用者,第三个参数表示回调函数。

关于回调

typedef void (CCObject::*SEL_MenuHandler)(CCObject *);

#define menu_selector(_SELECTOR)(SEL_MenuHandler)(&_SELECTOR)

 


CCMenu的坐标系统研究

fontItem->setPosition(ccp(winSize.width – 50,30));

menu->setPosition(CCPointZero);

CCLog("fontItem = %g %g", fontItem->getPositionX(),fontItem->getPositionY());

CCLog("menu = %g, %g,width %g,height = %g",menu->getPositionX(),menu->getPositionY(),

menu->getContentSize().width,menu->getContentSize().height);

 

C CCMenuItemImage

CCMenuItem *imageItem = CCMenuItemImage::create(“CloseNormal.png”,”CloseSelected.png”);

imageItem->setTarget(this,menu_selector(Menu::menuCallBack));

第1个参数为末点击是显示的图片,第二个参数为点击后显示的图片,最后参数可以放到setTarget中,意义同上。


CCMenuItemLabel

CCLabelBMFont *bm = CCLabelBMFont::create("bmFontLabelMenu",

"fonts/bitmapFontTest.fnt");

CCMenuItem * labelItem = CCMenuItemLabel::create(bm, this,menu_selector(MYMenu::menuCallBack));

menu->addChild(labelItem);

   
第一个参数为一个label,最后两个参数同上。


CCMenuItemSprite

CCSprite * normal = CCSprite::create(“gonormal.png”);

CCSprite * selected = CCSprite::create(“goselected.png”);

CCMenuItemSprite * spriteItem = CCMenuItemSprite::create(normal,selected,this,menu_selector(MYMenu::menuCallBack));

menu->addChild(spriteItem);

第一个参数和第二个参数为CCSprite后面的参数,同上。

  1. CCMenuItemToggle

CCMenuItem *t1 = CCMenuItemFont::create("ON");

CCMenuItem *t2 = CCMenuItemFont::create("OFF");

CCMenuItem *t3 = CCMenuItemFont::create("10%");

CCMenuItem *t4 = CCMenuItemFont::create("50%");

CCMenuItemToggle * toggle =

CCMenuItemToggle::createWithTarget(this,

menu_selector(T11Menu::menuCallBack), t1, t2, t3, t4, NULL);

menu->addChild(toggle);

  
第一个和第二个参数为回调函数调用者和回调函数,后面的参数为CCMenuItem.可以实现变化的菜单。

  1. 如何判断哪个菜单被点

打Tag

CCArray * array = menu->getChildren();

CCObject * obj;

int i = 0;

CCARRAY_FOREACH(array, obj)

{

CCMenuItem * item = (CCMenuItem *)obj;

item->setTag(i + 1000);

i++;

}

找Tag

CCMenuItem * item = (CCMenuItem *)obj;

Switch (item->getTag() - 1000) {

Case FONT1:

   
CCLog(“CCMenuItemFont”);

   
break;

case FONT2:

   
break;

case IMAGE:

   
break;

case BM:

   
break;

case SPRITE:

   
break;

case TOGGLE:

{

   
int index = ((CCMenuItemToggle *)item)->getSelectedIndex();

   
CCLog(“index = %d”,index);

}

break;

}

  1. 案例说明:

MYMenu.h

#ifndef
__MYMENU_H__

#define
__MYMENU_H__

#include
"cocos2d.h"

USING_NS_CC;

 

class
MYMenu :
public
CCLayer {

public:

   
CREATE_FUNC(MYMenu);

   
bool
init();

   
static
CCScene *
scene();

   
void
menuCallBack(CCObject
* obj);

 

   
enum
MENU

   
{

       
FONT1,
FONT2,
IMAGE,
LABELLABEL,
SPRITE,
TOGGLE

   
};

 

   
CCMenu *
menu;

};

 

#endif

 

MYMenu.cpp

#include
"MYMenu.h"

#include
"AppMacros.h"

 

CCScene *
MYMenu::scene()

{

   
CCScene *
scene =
CCScene::create();

   
MYMenu *
layer =
MYMenu::create();

   
scene->addChild(layer);

   
return
scene;

}

 

//五种菜单

#if 0

CCMenuItemFont;

CCMenuItemImage;

CCMenuItemLabel;

CCMenuItemSprite;

CCMenuItemToggle;

#endif

 

bool
MYMenu::init()

{

   
CCLayer::init();

 

   
//第1步:创建一个菜单

   
menu =
CCMenu::create();

 

   
//第2步:创建菜单项

   
//可以将下面的两行合并

   
CCMenuItem *
fontItem =
CCMenuItemFont::create("fontmenu");

   
fontItem->setTarget(this,
menu_selector(MYMenu::menuCallBack));

 

   
//显示menuItem在界面中的显示条项

   
CCLog("first
Item :x = %g y = %g",
fontItem->getPositionX(),
fontItem->getPositionY());

   
CCLog("first
Item Anchor x = %g,y = %g",
fontItem->getAnchorPoint().x,
fontItem->getAnchorPoint().y);

   
CCLog("first
Item ContentSize width %g hight %g",

       
fontItem->getContentSize().width,fontItem->getContentSize().height);

 

   
//创建第二个Menu条项

   
CCMenuItem *
fontItem2 =
CCMenuItemFont::create("fontmenu2");

   
fontItem2->setTarget(this,
menu_selector(MYMenu::menuCallBack));

 

   
//设置Menu在界面中的显示状态

   
//menu->alignItemsVerticallyWithPadding(40);

 

   
//显示menu在界面中的显示特征

   
CCLog("---------------------------------------------");

   
CCLog("Menu:x
= %g,y = %g",
menu->getPositionX(),
menu->getPositionY());

   
CCLog("Menu
Anchor x = %g y = %g",
menu->getAnchorPoint().x,
menu->getAnchorPoint().y);

   
CCLog("Menu
ContentSize width %g high %g",

       
menu->getContentSize().width,

       
menu->getContentSize().height);

 

   
//第2步:创建CCMenuItemImage类型的菜单项

   
CCMenuItem *imageItem
= CCMenuItemImage::create("CloseNormal.png","CloseSelected.png");

   
imageItem->setTarget(this,
menu_selector(MYMenu::menuCallBack));

 

   
//第2步:创建CCLabelBMFont类型的菜单项

   
CCLabelBMFont *
bm =
CCLabelBMFont::create("bmMenu",
"fonts/bitmapFontTest.fnt");

   
CCMenuItem *labelItem
= CCMenuItemLabel::create(bm);

   
labelItem->setTarget(this,menu_selector(MYMenu::menuCallBack));

 

   
//第2步:创建CCSprite类型的菜单项

   
CCSprite *nor
= CCSprite::create("btn_go_1.png");

   
CCSprite *sel
= CCSprite::create("btn_go_0.png");

   
CCMenuItem *
sprItem =
CCMenuItemSprite::create(nor,sel);

   
sprItem->setTarget(this,
menu_selector(MYMenu::menuCallBack));

 

   
//第2步:创建CCMenuItemToggle类型的菜单项

   
CCMenuItem *
t1 =
CCMenuItemFont::create("ON");

   
CCMenuItem *
t2 =
CCMenuItemFont::create("OFF");

   
CCMenuItem *
t3 =
CCMenuItemFont::create("10%");

   
CCMenuItem *
t4 =
CCMenuItemFont::create("%50%");

   
CCMenuItem *
toggle =
CCMenuItemToggle::createWithTarget(this,

       
                                                    
menu_selector(MYMenu::menuCallBack),

                                                           
 t1,t2,t3,t4,NULL);

 

   
//第3步:将菜单项添加到菜单中去

   
menu->addChild(fontItem);

   
menu->addChild(fontItem2);

   
menu->addChild(imageItem);

   
menu->addChild(labelItem);

   
menu->addChild(sprItem);

   
menu->addChild(toggle);

   
this->addChild(menu);

   

   
//第4步:设置菜单项的显示方式,让菜单项垂直显示

   
menu->alignItemsVertically();

 

   
//CCMenu类有一个getChildren()方法可以得到菜单项

   
CCArray * array =
menu->getChildren();

   
CCObject *
obj;

   
int
i = 0;

   
CCARRAY_FOREACH(array,
obj)

   
{

       
CCMenuItem *item
= (CCMenuItem *)obj;

       
item->setTag(i
+ 100);

       
i++;

   
}

 

   
/*

   
for (int i = 0; i < array->count();++i)

   
{

       
CCMenuItem *item = (CCMenuItem *)array->objectAtIndex(i);

       
item->setTag(i);

   
}

   
*/

 

   
return
true;

}

 

//回调函数

void
MYMenu::menuCallBack(CCObject
* obj)

{

   
CCMenuItem *
item = (CCMenuItem
*)obj;

   
switch (item->getTag()
- 1000)

   
{

   
case
FONT1:

       
CCLog("font
menu call ");

       
break;

   
case
FONT2:

       
break;

   
case
IMAGE:

       
break;

   
case
LABELLABEL:

       
break;

   
case
TOGGLE:

       
int
idx = ((CCMenuItemToggle
*)item)->getSelectedIndex();

       
CCLog("index
= %d",
idx);

       
break;

   
}

}

运行结果:

 

时间: 2014-10-24
Tags: 函数, Create, index

1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)的相关文章

Cocos2D-X入门(16)几种常用的 CCMenuItem、自定义Button

几种常用的菜单项: //字体菜单项 CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::onMenu)); //图片菜单项 CCMenuItemImage* itemImage = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this,

《Cocos2D-x权威指南》——3.4 布景层类

3.4 布景层类 布景层类CCLayer是CCNode类的子类,并且在此基础上实现触屏事件代理(TouchEventsDelegate)协议,可以实现CCNode类的功能,并且可以处理输入,包括触屏和加速度传感器. 每个游戏场景中可以有很多层,每一层负责各自的任务,如专门负责显示地图的背景.专门负责显示敌人.专门负责机关和专门负责主角等:每一层上可以放置不同的元素,包括文本.精灵图片和菜单等.通过层与层之间的组合关系,就可以构成游戏显示的界面UI,游戏中等.当然为了看到每一层的东西,可把一些层设

Cocos2D-X入门(2) 场景的切换及特效

在上节的基础上,看看怎么实现场景的切换. 添加一个场景WelcomeScene #include "WelcomeScene.h" #include "GameScene.h" using namespace cocos2d; CCScene* WelcomeScene::scene() { CCScene * scene = NULL; do { scene=CCScene::create(); WelcomeScene* gameScene=WelcomeSce

[cocos2d-x]HelloWorldDemo(Mac&amp;amp;Win7两个版本)

实现一个demo,具备以下功能: 1.让几个字分别位于中间和四个角落. 2.中间的字体改变,并且带有闪烁功能. 3.单点触摸和多点触摸,并且能够实现滑动效果,滑动的话必须使用带有bool返回值的单点触摸设置为true. 4.下面两个按钮能够实现添加节点和移除节点的作用. 效果图: 实现代码: HelloWorldScene.h: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h&qu

第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容.创建工程我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Cocos Code IDE集成开发工具很好地集成,不便于程序编写和调试.由于Cocos Code IDE工具是Cocos2d-x开发的专门为Cocos2d-JS和Cocos2d-x Lua开发设计的,因此使用Cocos Code IDE工具很方便创建Cocos2d-x Lua工

Cocos2d-x坐标系介绍

在图形图像和游戏应用开发中坐标系是非常重要的我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的.而在Cocos2d-x坐标系中它原点是在左下角的而且Cocos2d-x坐标系又可以分为世界坐标和模型坐标. UI坐标 UI坐标就是Android和iOS等应用开发的时候使用的二维坐标系.它的原点是在左上角的. UI坐标原点是在左上角x轴向右为正y轴向下为正.我们在Android和iOS等平台使用的视图.控件等都是遵守这个坐标系.然而在Cocos2d-x默认不是采用UI

Cocos2d-x实例:设置背景音乐与音效-HelloWorld场景实现

HelloWorld场景就是游戏中的主菜单场景.HelloWorld.h文件代码如下 #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" ① #include "SettingScene.h" class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scen

Cocos2d-x优化中纹理优化

1.纹理像素格式纹理优化工作的另一重要的指标是纹理像素格式能够最大程度满足用户对保真度要求的情况下选择合适的像素格式可以大幅提高纹理的处理速度.而且纹理像素格式有与硬件有这密切的关系.下面我们先了解一下纹理像素的格式主要的格式有RGBA8888.32位色它是默认的像素格式每个通道8位比特每个像素4个字节.BGRA8888.32位色每个通道8位比特每个像素4个字节.RGBA4444.16位色每个通道4位比特每个像素2个字节.RGB888.24位色没有Alpha通道所以没有透明度.每个通道8位比特每

Cocos2d-x中Vector&amp;lt;T&amp;gt;容器以及实例介绍

Vector<T> 是Cocos2d-x 3.x推出的列表容器因此它所能容纳的是Ref及子类所创建的对象指针其中的T是模板表示能够放入到容器中的类型在Cocos2d-x 3.x中T表示Ref类.Vector<T>是模仿C++的std::vector<T>模板类而设计的.在内存管理方面不使用__Array的引用计数它的内存管理是由编译器自动处理的可以不用考虑内存释放问题.Vector<T>的性能优于__Array类Coco2d-x官方将Vector<T&

ios-在cocos3D中创建menu

问题描述 在cocos3D中创建menu 需要在cocos3D中创建一个menu.我会在cocos2D中实现,因此用同样的方法试了试: CCMenuItemImage *item1=[CCMenuItemImage itemFromNormalImage:@"up.png" selectedImage:@"images.jpeg" target:self selector:@selector(up:)]; CCMenu *mnu1=[CCMenu menuWithI