首页 > 代码库 > Cocos2d-X中的菜单

Cocos2d-X中的菜单

在Cocos2d-X实现显示菜单的方式比較特殊,首先须要使用CCMenu创建一个菜单,然后使用CCMenuItem创建一个菜单项,实际上程序中显示的菜单是使用CCMenu和CCMenuItemFont共同作用的结果,在Cocos2d-X中CCMenu仅仅是一个容器,须要使用CCMenuItemFont才干实现创建菜单

程序演示样例:创建一个简单的菜单

程序代码:

#include "Menu.h"

CCScene* Menu::scene()
{
    CCScene* scene = CCScene::create();
    
    Menu* layer = Menu::create();

    scene->addChild(layer);

    return scene;
}


bool Menu::init()
{
    //初始化父类层
    CCLayer::init();

    //得到窗体的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //创建一个Menu(看不到效果,Menu仅仅是一个容器)
    CCMenu* menu = CCMenu::create();

    //加入Menu
    addChild(menu);

    //创建一个MenuItem, 默认的Item位置就在中央
    CCMenuItemFont* item = CCMenuItemFont::create("This is item");

    //将MenuItem添加到Menu上
    menu->addChild(item1);

    return true;
}


运行结果:

技术分享


程序演示样例:创建多个菜单,而且实现菜单响应事件

在Menu.h中加入以下的代码

#ifndef __Menu_H__
#define __Menu_H__

#include "cocos2d.h"
USING_NS_CC;

class Menu : public CCLayer
{
public:
     bool init();  

    static CCScene* scene();

    void menuHandler(CCObject*);

    CREATE_FUNC(Menu);
};

#endif // __HELLOWORLD_SCENE_H__


在Menu.cpp中加入以下的代码

#include "Menu.h"

CCScene* Menu::scene()
{
    CCScene* scene = CCScene::create();
    
    Menu* layer = Menu::create();

    scene->addChild(layer);

    return scene;
}


bool Menu::init()
{
    //初始化父类层
    CCLayer::init();

    //得到窗体的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //创建一个Menu(看不到效果。Menu仅仅是一个容器)
    CCMenu* menu = CCMenu::create();

    //加入Menu
    addChild(menu);

    //创建一个MenuItem, 默认的Item位置就在中央
    CCMenuItemFont* item1 = CCMenuItemFont::create("This is item1");

    //将MenuItem添加到Menu上
    menu->addChild(item1);

     //创建一个MenuItem, 默认的Item位置就在中央
    CCMenuItemFont* item2 = CCMenuItemFont::create("This is item2");

    //加入MenuItem
     menu->addChild(item2);

     //设置item2的位置
     item2->setPositionY(item1->getPositionY() - 100);

    //设置响应函数:当触摸到item时调用Menu::menuHandler
    //第一个參数:响应函数所在的对象
    //第二个參数:成员函数指针
    item1->setTarget(this, menu_selector(Menu::menuHandler));
    item2->setTarget(this, menu_selector(Menu::menuHandler));

    //设置菜单项的ID
    //item1的ID为1
    //item2的ID为2
    item1->setTag(1);
    item2->setTag(2);

    return true;
}

//响应菜单事件
void Menu::menuHandler(CCObject* obj)
{
    //将obj强制转换成菜单项类型
    CCMenuItemFont* item = (CCMenuItemFont*)obj;

    //得到菜单项的ID
    int tag = item->getTag();

    //推断用户点击了那个菜单
    if(1 == tag)
    { 
        MessageBox(NULL, TEXT("item1 is clicked !"), TEXT("MenuItem响应"), MB_OK);
    }
    else
    {
        MessageBox(NULL, TEXT("item2 is clicked !"), TEXT("MenuItem响应"), MB_OK);
    }
}


运行结果:

技术分享


当单击“This is Item1”后:

技术分享


当单击“This is Item2”后:

技术分享

??

Cocos2d-X中的菜单