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


    

    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;

        }

    }

    执行结果:

     

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

  • 相关阅读:
    ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
    ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
    EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
    EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
    EasyPlayer RTSP安卓Android播放器架构简析
    EasyPlayer RTSP安卓Android播放器架构简析
    解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
    解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
    EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
    EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4741730.html
Copyright © 2020-2023  润新知