码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-19 13:03:02      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:



CCMenu

  1. 基本结构

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

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

CCMenuItemFont;CCMenuItemImage;CCMenuItemLabel;CCMenuItemSprite;CCMenuItemToggle;

是真正的须要实例化的菜单项。须要addChildCCMenu对象中去。

演示样例:

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

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

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

CCMenu * menu = CCMenu::create();

menu->addChild(item);

addChild(menu);

  1. CCMenuItem

A  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)

 

B  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中。意义同上。

D  CCMenuItemLabel

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

"fonts/bitmapFontTest.fnt");

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

menu->addChild(labelItem);

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

E  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)

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/4741730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!