3.4.4 菜单类CCMenu

游戏中常用的菜单如图3-17所示,其中菜单项可以是图片、系统字,或者自定义的字体。

图3-17 游戏中常用的菜单示例

CCMenu是一个菜单项的容器,用来装载各种菜单项。代码清单3-23就是一个定义CCMenu类实例的过程,是tests项目中MenuTest.cpp的MenuLayer2的构造函数。

代码清单3-23 定义CCMenu类实例

MenuLayer2::MenuLayer2()
{
    for(int i=0;i < 2;i++)
    {
        CCMenuItemImage* item1=CCMenuItemImage::create(s_PlayNormal,s_
    PlaySelect,this,menu_selector(MenuLayer2::menuCallback));
        CCMenuItemImage* item2=CCMenuItemImage::create(s_HighNormal,s_
    HighSelect,this,menu_selector(MenuLayer2::menuCallbackOpacity));
        CCMenuItemImage* item3=CCMenuItemImage::create(s_AboutNormal,s_
    AboutSelect,this,menu_selector(MenuLayer2::menuCallbackAlign));
        item1->setScaleX(1.5f);
        item2->setScaleX(0.5f);
        item3->setScaleX(0.5f);
        CCMenu* menu=CCMenu::create(item1,item2,item3,NULL);
        CCSize s=CCDirector::sharedDirector()->getWinSize();
        menu->setPosition(ccp(s.width/2,s.height/2));
        menu->setTag(kTagMenu);
        addChild(menu,0,100+i);
        m_centeredMenu=menu->getPosition();
    }
    m_alignedH=true;
    alignMenusH();
}

首先定义菜单项(关于菜单项,本书会在后面的章节中做讲解),然后用它们定义初始化菜单CCMenu实例,最后将CCMenu实例加入CCLayer中显示出来,效果如图3-18所示。

菜单类还提供了alignItemsVertically和align-ItemsHorizontally等函数。如代码清单3-24所示,tests项目中MenuTest.cpp的MenuLayer2的构造函数alignMenusH就是alignItems-Horizontally水平对齐两种方法对比,一种是alignItems-Horizontally水平对齐,底下是alignItemsHorizontallyWithPadding留空间水平对齐,效果对比请见之前的图3-18。

图3-18 定义的菜单对象显示效果

代码清单3-24 对齐方法对比函数

void MenuLayer2::alignMenusH()
{
    for(int i=0;i<2;i++)
    {
        CCMenu *menu=(CCMenu*)getChildByTag(100+i);
        menu->setPosition(m_centeredMenu);
        if(i==0)
        {
            //TIP:if no padding,padding=5
            menu->alignItemsHorizontally();
            CCPoint p=menu->getPosition();
            menu->setPosition(ccpAdd(p,CCPointMake(0,30)));
        }
        else
        {
            //TIP:but padding is configurable
            menu->alignItemsHorizontallyWithPadding(40);
            CCPoint p=menu->getPosition();
            menu->setPosition(ccpSub(p,CCPointMake(0,30)));
        }
    }
}

使用方法比较简单,直接调用就可以。下一节介绍Cocos2D-x中的UI控件。