zoukankan      html  css  js  c++  java
  • 实例介绍Cocos2d-x精灵菜单和图片菜单

    灵菜单类是MenuItemSprite,图片菜单类是MenuItemImage。由于MenuItemImage继承于MenuItemSprite,所以图片菜单也属于精灵菜单。为什么叫精灵菜单呢?那是因为这些菜单项具有精灵的特点,我们可以让精灵动起来,具体使用时候是把一个精灵放置到菜单中作为菜单项。

    精灵菜单类MenuItemSprite,它的其中一个创建函数create定义如下:

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <span style="font-size:14px;">static MenuItemSprite* create  ( Node * normalSprite,  //菜单项正常显示时候的精灵  
    2.  Node *  selectedSprite,                                               //选择菜单项时候的精灵  
    3.  Node *  disabledSprite,                                               //菜单项禁用时候的精灵  
    4.  const ccMenuCallback & callback                             //菜单操作的回调函数指针  
    5.  )</span>  

     

     

    使用MenuItemSprite比较麻烦,在创建MenuItemSprite之前要先创建三种状态时候的精灵(即normalSpriteselectedSpritedisabledSprite)。MenuItemSprite还有一些create函数,在这些函数中可以省略disabledSprite参数。

    如果精灵是由图片构成的,我们可以使用图片菜单MenuItemImage实现与精灵菜单同样的效果。MenuItemImage类的其中一个创建函数create定义如下:

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <span style="font-size:14px;">static MenuItemImage* create  ( const std::string &  normalImage, //菜单项正常显示时候的图片  
    2.  const std::string & selectedImage,                                                        //选择菜单项时候的图片  
    3.  const std::string & disabledImage,                                              //菜单项禁用时候的图片  
    4.  const ccMenuCallback & callback                                                        //菜单操作的回调函数指针  
    5.  )</span>  


     

    MenuItemImage还有一些create函数,在这些函数中可以省略disabledImage参数。

    我们通过一个实例介绍一下精灵菜单和图片菜单的使用,这个实例如下图所示。

     

    下面我们看看HelloWorldScene.cppinit函数如下:

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <span style="font-size:14px;">bool HelloWorld::init()  
    2. {  
    3.    if ( !Layer::init() )  
    4.    {  
    5.        return false;  
    6.    }  
    7.      
    8.    Size visibleSize = Director::getInstance()->getVisibleSize();  
    9.    Point origin = Director::getInstance()->getVisibleOrigin();  
    10.    
    11.    Sprite *bg = Sprite::create("menu/background.png");     
    12.    bg->setPosition(Point(origin.x + visibleSize.width/2,  
    13.                              origin.y + visibleSize.height/2));  
    14.    this->addChild(bg);  
    15.    
    16.     //开始精灵  
    17.    Sprite *startSpriteNormal =Sprite::create("menu/start-up.png");                                     ①  
    18.    Sprite *startSpriteSelected =Sprite::create("menu/start-down.png");                                      ②  
    19.    
    20.     MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,  
    21.                                         startSpriteSelected,  
    22.          CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));                                     ③  
    23.     startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));             ④  
    24.      
    25.     //设置图片菜单  
    26.   MenuItemImage *settingMenuItem = MenuItemImage::create(  
    27.                             "menu/setting-up.png",  
    28.                             "menu/setting-down.png",  
    29.                              CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));             ⑤  
    30.     settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));                  ⑥  
    31.      
    32.     //帮助图片菜单  
    33.    MenuItemImage *helpMenuItem = MenuItemImage::create(  
    34.                             "menu/help-up.png",  
    35.                             "menu/help-down.png",  
    36.                                   CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));                      ⑦  
    37.     helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));            ⑧  
    38.    
    39.     Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);                  ⑨  
    40.     mu->setPosition(Point::ZERO);                                                                                                    ⑩  
    41.     this->addChild(mu);  
    42.    
    43.    return true;  
    44. }</span>  


     

    在上面的代码中第①~②行是创建两种不同状态的精灵,第③行代码是创建精灵菜单MenuItemSprite对象,第④行代码是设置开始菜单项(startMenuItem)位置,注意这个坐标是(700,170),由于(700, 170)的坐标是UI坐标,需要转换为OpenGL坐标。

    第⑤和⑦行代码是创建图片菜单MenuItemImage对象,第⑥和⑧行代码是设置图片菜单位置。第⑨行代码是菜单Menu对象,第⑩行代码是菜单的位置mu->setPosition(Point::ZERO),设置的位置是Point::ZERO,它等价于Point(0.0f,0.0f)

    还有由于背景图片大小是1136 x 640,而Win32默认窗口大小是960 x 640,我们需要重新设置大小,修改AppDelegate.cpp代码如下:

     

     

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. bool HelloWorld::init()  
    2. {  
    3.    if ( !Layer::init() )  
    4.    {  
    5.        return false;  
    6.    }  
    7.      
    8.    Size visibleSize = Director::getInstance()->getVisibleSize();  
    9.    Point origin = Director::getInstance()->getVisibleOrigin();  
    10.    
    11.    Sprite *bg = Sprite::create("menu/background.png");     
    12.    bg->setPosition(Point(origin.x + visibleSize.width/2,  
    13.                              origin.y + visibleSize.height/2));  
    14.    this->addChild(bg);  
    15.    
    16.     //开始精灵  
    17.    Sprite *startSpriteNormal =Sprite::create("menu/start-up.png");                                     ①  
    18.    Sprite *startSpriteSelected =Sprite::create("menu/start-down.png");                                      ②  
    19.    
    20.     MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,  
    21.                                         startSpriteSelected,  
    22.          CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));                                     ③  
    23.     startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));             ④  
    24.      
    25.     //设置图片菜单  
    26.   MenuItemImage *settingMenuItem = MenuItemImage::create(  
    27.                             "menu/setting-up.png",  
    28.                             "menu/setting-down.png",  
    29.                              CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));             ⑤  
    30.     settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));                  ⑥  
    31.      
    32.     //帮助图片菜单  
    33.    MenuItemImage *helpMenuItem = MenuItemImage::create(  
    34.                             "menu/help-up.png",  
    35.                             "menu/help-down.png",  
    36.                                   CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));                      ⑦  
    37.     helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));            ⑧  
    38.    
    39.     Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);                  ⑨  
    40.     mu->setPosition(Point::ZERO);                                                                                                    ⑩  
    41.     this->addChild(mu);  
    42.    
    43.    return true;  
    44. }  

    在上面的代码中第①~②行是创建两种不同状态的精灵,第③行代码是创建精灵菜单MenuItemSprite对象,第④行代码是设置开始菜单项(startMenuItem)位置,注意这个坐标是(700,170),由于(700, 170)的坐标是UI坐标,需要转换为OpenGL坐标。

    第⑤和⑦行代码是创建图片菜单MenuItemImage对象,第⑥和⑧行代码是设置图片菜单位置。第⑨行代码是菜单Menu对象,第⑩行代码是菜单的位置mu->setPosition(Point::ZERO),设置的位置是Point::ZERO,它等价于Point(0.0f,0.0f)

    还有由于背景图片大小是1136 x 640,而Win32默认窗口大小是960 x 640,我们需要重新设置大小,修改AppDelegate.cpp代码如下:

     

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <pre code_snippet_id="340364" snippet_file_name="blog_20140512_5_4431376" name="code" class="html">boolAppDelegate::applicationDidFinishLaunching() {  
    2.    // initialize director  
    3.    auto director = Director::getInstance();  
    4.    auto glview = director->getOpenGLView();  
    5.    if(!glview) {  
    6.        glview = GLView::create("My Game");  
    7.              glview->setFrameSize(1136, 640);                                                                              ①  
    8.        director->setOpenGLView(glview);  
    9.    }  
    10.    
    11. … …  
    12. }</pre>  
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1.   

    我们需要在第①行添加glview->setFrameSize(1136, 640)代码。

  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3723165.html
Copyright © 2011-2022 走看看