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;

}

}

执行结果:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

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

  1. 3.cocos2dx它Menu,由menu为了实现场景切换

     1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...

  2. Cocos2d-X中Menu的综合运用

    今天将曾经写的代码和项目集成到了一个菜单中,能够通过菜单切换到曾经做的项目 程序的project文件夹 主要代码分析: LessonMenu.h中实现创建菜单,遍历菜单通过菜单切换到各个项目 #ifn ...

  3. Cocos2d-x之Menu

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. cocos2d-x菜单简介: 菜单也是游戏开发中的重要环节,一般游戏开始的第一个画面都是游戏主菜单,这些菜单包括,开始游戏,游戏设置,关卡 ...

  4. cocos2dx中的菜单项CCMenuItem及其五个子类的使用

    /*CCMenuItem是一个虚基类,因此必须实现它的五个子类之一,再把子类对象赋给父类指针,相当于多态*/ CCMenuItem *fontItem = CCMenuItemFont::create ...

  5. Learning Cocos2d-x for WP8(5)——详解Menu菜单

    原文:Learning Cocos2d-x for WP8(5)--详解Menu菜单 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(5)——详解Menu菜单 菜单是游戏必不 ...

  6. cocos2d-x Menu、MenuItem

    转自:http://codingnow.cn/cocos2d-x/832.html 学习cocos2d-x中的菜单主要需要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuIt ...

  7. cocos2d-x 菜单

    菜单在游戏中是非常常见的控件之一.下面来分析下在cocos2dx中有那些菜单. 一共有六种菜单. CCMenu在创建时需要使用CCMenuItem来创建. CCMenu继承自CCLayer,是一个菜单 ...

  8. 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010    一.菜单项(CCMenuItem) 菜单项 ...

  9. Cocos2d中的Menu使用

    学习cocos2d-x中的菜单主要须要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuItem的详细子类. a. 以下来学习一下相关的类. 1. CCMenu 菜单,是CCL ...

随机推荐

  1. 矩阵求逆c++达到

    高斯消元法能够用来找出一个可逆矩阵的逆矩阵.设A 为一个N * N的矩阵,其逆矩阵可被两个分块矩阵表示出来.将一个N * N单位矩阵 放在A 的右手边,形成一个N * 2N的分块矩阵B = [A,I] ...

  2. 将cocos2dx+lua创建的游戏port到windows phone

    在整个Port的过程中遇到的问题总结例如以下 1.一定要使用最新版本号的cocos2dx,原因大家看一下changelog就知道了,近期的cocos2dx版本号都是在修windows phone上的b ...

  3. 淘宝API学习之道:淘宝API相关了解

    淘宝API开发平台,经过两年多的升级一系列动作,提供的api接口日渐稳定.看到淘宝api开发的浏览量还是较大,但那会写的DEMO如今已不能执行,淘宝改了链接地址,改了加密算法,为了不让大家浪费时间,特 ...

  4. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  5. 于XAML导入命名空间的代码

    例如,下面的代码到指定的命名空间.不仅导入的命名空间,并且还为指定的命名空间前缀local.当然,你也可以指定一个前缀为另一个名称,这可以定义.导入后,市民可以在命名当前空间XAML使用代码.例如,在 ...

  6. iptables惹的祸

    我的工作环境总是一台Mac机+在Mac机上跑的虚拟机(Virtual Box) 有一个错误我总是在犯:宿主机总是无訪问到虚拟机里的web服务. 解决方法也非常easy:那就是关闭虚拟机上的防火墙!!! ...

  7. NSIS常用代码整理

    原文 NSIS常用代码整理 这是一些常用的NSIS代码,少轻狂特意整理出来,方便大家随时查看使用.不定期更新哦~~~ 1 ;获取操作系统盘符 2 ReadEnvStr $R0 SYSTEMDRIVE ...

  8. hibernate set的3属性

    inverse 属性 在hibernate通过对 inverse 和表之间的关系. inverse = false 的为主动方,inverse = true 的为被动方, 由主动方负责维护关联关系 在 ...

  9. mybatis型材xxxx.xml缺少后果返回类型

    下面是一个mybatis型材xxxx.xml失踪resultMap错误: 严重: Servlet.service() for servlet [SpringMVC] in context with p ...

  10. 关于在同一母版页中使用多个CSS文件的解决方案

    原文:关于在同一母版页中使用多个CSS文件的解决方案 以前都用.NET1.1没遇到这问题,现在换了2.0开始学着使用母版,结果就遇到了这个问题,在百度上一搜索才发现有不少人提出这个问题,但没找到好的解 ...