zoukankan      html  css  js  c++  java
  • 04--简单菜单使用

    准备工作        

            首先创建一个Cocos2DX-win32应用程序,项目名称未MenuDemo并取消Box2D和声音的支持,如下图:

              imageimage

    点击“Finish”有运行一下项目,如下图没有问题

    (windows下配置见 http://www.cnblogs.com/BlueBeauty/p/3687542.htmlhttp://www.cnblogs.com/BlueBeauty/p/3690409.html

                    image

    图片菜单使用

            为了便于观察,我将背景和“HelloWorld”注释掉。其实在新创建的项目中已经有了一个菜单就是右下角关闭菜单。我们再添加一个Play菜单。首先看看CCMenuItemImage创建菜单函数的原型  static CCMenuItemImage* create(const char *normalImage, const char *selectedImage,  CCObject* target, SEL_MenuHandler selector)。前两个参数是普通状态和选择状态的图片名称,最后一个参数是一个函数指针,也就是点这个菜单要做的事情。首先选择两张图片拷贝到项目目录的Resources下,然后在HelloWorldScene.cpp文件的init方法中添加如下代码
          

    CCMenuItemImage *pPlay = CCMenuItemImage::create(
                "btn-play-normal.png",
                "btn-play-selected.png",
                this,
                menu_selector(HelloWorld::menuCloseCallback)
           );
    pPlay->setPosition(ccp(0,0));
    CCMenu* pMenu = CCMenu::create(pCloseItem,pPlay, NULL);  // CCMenu* pMenu = CCMenu::create(pCloseItem, NULL)

           保存运行项目,如图:

                 imageimageimage

            我们看到图片菜单出现在了窗口的左下方但又没显示完整。为了把图片显示完整,再来修改一个菜单的位置pPlay->setPosition(ccp(125/2,42/2)) (图片大小为125,42)如上图。由此我们可以确定引擎将显示区域的左下角顶为原点;setPosition函数设置的是元素的中心点在现实区域的位置。那如何才能将菜单放在正中间呢,这样做还要用到一个来自CCDirector类getWinSize的函数。这个函数的名称期初让我一些迷惑,以为获取的大小包含了窗体的标题栏和边框,其实不然该函数返回的大小就是现实区域的大小。小伙们下断跟踪一下就知道了。

            好了,这个菜单就还差自己的回调函数,其实不难就不写了记得在头文件中实现声明哦。

    文本菜单使用

            下面再学一下文本菜单的使用,文本标签菜单的使用需要提供一个文本标签,还是看看函数声明

                   static CCMenuItemLabel * create(CCNode*label, CCObject* target, SEL_MenuHandler selector);

            首先添加一个回调函数,如下:

    HelloWorldScene.h
    class HelloWorld : public cocos2d::CCLayer
    {
    public:
        virtual bool init();  
    
       static cocos2d::CCScene* scene();
        
        // a selector callback
        void menuCloseCallback(CCObject* pSender);
        void menuPlayCallback(CCObject* pSender);
        void menuPlayLabelCallback(CCObject* pSender);
        // implement the "static node()" method manually
        CREATE_FUNC(HelloWorld);
    };
    
    HelloWorldScene.cpp
    void HelloWorld::menuPlayLabelCallback(CCObject* pSender)
    {
        CCLOG("menuPlayLabelCallback");    
    }

        修改init方法

    CCMenuItemImage *pPlay = CCMenuItemImage::create(
                "btn-play-normal.png",
                "btn-play-selected.png",
                this,
                menu_selector(HelloWorld::menuPlayCallback)
                );
            pPlay->setPosition(ccp(size.width/2,size.height/2));
    
            //新加的
            CCLabelTTF* pLabel = CCLabelTTF::create("Label Menu Demo","Arial",30);
            CCMenuItemLabel* pMenuLabel = CCMenuItemLabel::create(
                pLabel,this,menu_selector(HelloWorld::menuPlayLabelCallback));
            pMenuLabel->setPosition(
                ccp(size.width/2,size.height/2-42)
                );
            CCMenu* pMenu = CCMenu::create(pCloseItem,pPlay,pMenuLabel, NULL);

    F5看看效果吧

                                                                    image

  • 相关阅读:
    JavaScript作用域学习笔记
    Object.prototype.toString.call() 区分对象类型
    oracle 经典SQL整理
    day31
    ID3决策树
    C# 中浅拷贝与深拷贝区别
    C#值类型和引用类型的区别
    C#守护进程(windows服务)
    C#线程池
    C#双缓冲绘图
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3691732.html
Copyright © 2011-2022 走看看