cocos2d-x学习笔记-CCMenu和CCMenuItem详解

http://blog.csdn.net/zhoujianghai/article/details/8145015

学习cocos2d-x中的菜单主要需要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuItem的具体子类。
a. 下面来学习一下相关的类。
1. CCMenu

菜单,是CCLayer的子类,是一个层(容器),可以往里面添加菜单项。下面是它的类结构图:


CCMenu默认接受触屏事件的优先级是-128(优先级很高,因为值越小,响应触屏事件的优先级越高),可以通过继承它实现自定义的效果,创建CCMenu对象的函数:

  1. staticCCMenu*menuWithItems(CCMenuItem*item,...);
  2. staticCCMenu*menuWithItem(CCMenuItem*item);

2. CCMenuItem
菜单项,开发中一般是直接使用它的子类。CCMenuItem有三个直接子类:
CCMenuItemLabel(字符标签菜单)、CCMenuItemSprite(图片菜单)、CCMenuItemToggle(开关菜单)
下面是CCMenuItem的类结构图:

现在分别来了解一下各个不同的菜单项。
(1) CCMenuItemLabel:使用文字标签创建菜单项
所有支持CCLabelProtocol的节点都可以用来创建CCMenuItemLabel,CCLabelProtocol是标签的共同接口。CCLabelProtocol也有三个直接子类,下面是类结构图:


CCLabelTTF:同时也是CCSprite的子类,用来渲染文字标签的,可以指定字体,每次设置字符串内容时都需要重新创建纹理和渲染,性能不好,可以看它的相关源码:

copy
    voidCCLabelTTF::setString(constchar*label)
  1. {
  2. if(m_pString)
  3. deletem_pString;
  4. m_pString=NULL;
  5. }
  6. m_pString=newstd::string(label);
  7. CCTexture2D*texture;
  8. if(CCSize::CCSizeEqualToSize(m_tDimensions,CCSizeZero))
  9. texture=newCCTexture2D();
  10. texture->initWithString(label,m_pFontName->c_str(),m_fFontSize);
  11. else
  12. {
  13. texture=newCCTexture2D();
  14. texture->initWithString(label,m_tDimensions,m_eAlignment,m_fFontSize);
  15. }
  16. this->setTexture(texture);
  17. texture->release();
  18. CCRectrect=CCRectZero;
  19. rect.size=m_pobTexture->getContentSize();
  20. this->setTextureRect(rect);
  21. }

可以用CCLabelBMFont或者CCLabelAtlas代替它。
CCLabelBMFont :也是CCSpriteBatchNode的子类,创建CCLabelBMFont对象需要一个字符串和一个fnt格式的文件(字库),如:
copy
    CCLabelBMFont*label=CCLabelBMFont::labelWithString("BitmapFontAtlas","fonts/bitmapFontTest.fnt");

这个fnt文件包含了这些信息:对应图片的名字(图片包含了所有你要绘制的字符)、图片中的字符对应的unicode编码、字符在图片中的坐标、宽高等。初始化CCLabelBMFont对象时,会把图片添加到缓存(CCTextureCache)中,解析fnt文件,把fnt文件中对应的信息保存到一个ccBMFontDef类型的数组里面,数组的索引是charId(字符的unicode编码值),ccBMFontDef是一个结构体:
copy
    typedefstruct_BMFontDef{
  1. //!IDofthecharacter
  2. unsignedintcharID;
  3. //!originandsizeofthefont
  4. CCRectrect;
  5. //!TheXamounttheimageshouldbeoffsetwhendrawingtheimage(inpixels)
  6. intxOffset;
  7. //!TheYamounttheimageshouldbeoffsetwhendrawingtheimage(inpixels)
  8. intyOffset;
  9. //!Theamounttomovethecurrentpositionafterdrawingthecharacter(inpixels)
  10. intxAdvance;
  11. }ccBMFontDef;

绘制字符串时,根据字符对应的unicode码去查找ccBMFontDef信息,从缓存中取出图片,再根据ccBMFontDef中坐标、宽高取出对应区域的字符图片,把字符在字符串中的索引位置作为tag添加到CCLabelBMFont中,因为CCLabelBMFont本身是CCSpriteBatchNode,这样就实现了批处理渲染精灵,提高了性能。下面是创建字符对应的CCSprite的部分代码:
copy
    voidCCLabelBMFont::createFontChars()
  1. /**....*/
  2. //以下代码是遍历字符串时:for循环内的代码
  3. constccBMFontDef&fontDef=(*(m_pConfiguration->m_pBitmapFontArray))[c];
  4. CCRectrect=fontDef.rect;
  5. CCSprite*fontChar;
  6. fontChar=(CCSprite*)(this->getChildByTag(i));
  7. if(!fontChar)
  8. fontChar=newCCSprite();
  9. fontChar->initWithBatchNodeRectInPixels(this,rect);
  10. this->addChild(fontChar,i);
  11. fontChar->release();
  12. else
  13. //reusingfonts
  14. fontChar->setTextureRectInPixels(rect,false,rect.size);
  15. //restoretodefaultincasetheyweremodified
  16. fontChar->setIsVisible(true);
  17. fontChar->setOpacity(255);
  18. }

CCLabelAtlas :也是CCAtlasNode的子类,创建一个CCLabelAtlas对象的代码如下:
copy
    staticCCLabelAtlas*labelWithString(char*label,char*charMapFile,unsignedintitemWidth,87); background-color:inherit; font-weight:bold">intitemHeight,87); background-color:inherit; font-weight:bold">charstartCharMap);
  1. //示例
  2. CCLabelAtlas*label1=CCLabelAtlas::labelWithString("123Test","fonts/tuffy_bold_italic-charmap.png",48,64,'');

参数的含义:要绘制的字符,图片文件,图片文件中每个字符的宽度,图片文件中每个字符的高度,图片的起始字符。
CCAtlasNode封装了一个CCTextureAtlas的变量,CCTextureAtlas初始化图片文件的时候会把图片加载到缓存(CCTextureCache)中:
copy
    boolCCTextureAtlas::initWithFile(char*file,87); background-color:inherit; font-weight:bold">intcapacity)
  1. //retainedinproperty
  2. CCTexture2D*texture=CCTextureCache::sharedTextureCache()->addImage(file);
  3. if(texture)
  4. returninitWithTexture(texture,capacity);
  5. CCLOG("cocos2d:Couldnotopenfile:%s",file);
  6. deletethis;
  7. returnNULL;
  8. 接下来CCTextureAtlas负责管理该大图,可以随意绘制图片的某一矩形区域,渲染方式采用的是OpenGL ES VBO(顶点缓冲对象,保存在显存中)。 CCTextureAtlas有一个m_pQuads属性,它是CCTextureAtlas类的核心,是一个ccV3F_C4B_T2F_Quad类型的数组,ccV3F_C4B_T2F_Quad是一个结构体,有四个成员属性,它们都是ccV3F_C4B_T2F类,分别表示左上,左下,右上,右下。看源码:
    copy
      //!aPointwithavertexpoint,atexcoordpointandacolor4B
    1. struct_ccV3F_C4B_T2F
    2. //!vertices(3F)
    3. ccVertex3Fvertices;//12bytes
    4. //char__padding__[4];
    5. //!colors(4B)
    6. ccColor4Bcolors;//4bytes
    7. //char__padding2__[4];
    8. //texcoords(2F)
    9. ccTex2FtexCoords;//8byts
    10. }ccV3F_C4B_T2F;
    11. //!4ccVertex2FTex2FColor4BQuad
    12. struct_ccV2F_C4B_T2F_Quad
    13. //!bottomleft
    14. ccV2F_C4B_T2Fbl;
    15. //!bottomright
    16. ccV2F_C4B_T2Fbr;
    17. //!topleft
    18. ccV2F_C4B_T2Ftl;
    19. //!topright
    20. ccV2F_C4B_T2Ftr;
    21. }ccV2F_C4B_T2F_Quad;

    ccV3F_C4B_T2F有三个成员,分别表示:顶点、颜色、纹理坐标。
    CCTextureAtlas类就是根据这个数组来绘制矩形的,数组的容量就是要绘制的字符数量。指定字符串的时候:是根据指定字符的ASCII码值跟startCharMap(图片起始字符)ASCII码值的偏移量,得到该字符在图片上的区域的,然后生成绘制矩形所需要的数据,源码:
    copy
      //CCLabelAtlas-CCLabelProtocol
    1. voidCCLabelAtlas::setString(char*label)
    2. /**....*/
    3. this->updateAtlasValues();
    4. //CCLabelAtlas-Atlasgeneration
    5. voidCCLabelAtlas::updateAtlasValues()
    6. intn=m_sString.length();
    7. ccV3F_C4B_T2F_Quadquad;
    8. constunsignedchar*s=(unsignedchar*)m_sString.c_str();
    9. CCTexture2D*texture=m_pTextureAtlas->getTexture();
    10. floattextureWide=(float)texture->getPixelsWide();
    11. floattextureHigh=(float)texture->getPixelsHigh();
    12. for(unsignedinti=0;i<n;i++){
    13. unsignedchara=s[i]-m_cMapStartChar;
    14. floatrow=(float)(a%m_uItemsPerRow);
    15. floatcol=(float)(a/m_uItemsPerRow);
    16. #ifCC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
    17. //Issue#938.Don'tusetexStepX&texStepY
    18. floatleft=(2*row*m_uItemWidth+1)/(2*textureWide);
    19. floatright=left+(m_uItemWidth*2-2)/(2*textureWide);
    20. floattop=(2*col*m_uItemHeight+1)/(2*textureHigh);
    21. floatbottom=top+(m_uItemHeight*2-2)/(2*textureHigh);
    22. #else
    23. floatleft=row*m_uItemWidth/textureWide;
    24. floatright=left+m_uItemWidth/textureWide;
    25. floattop=col*m_uItemHeight/textureHigh;
    26. floatbottom=top+m_uItemHeight/textureHigh;
    27. #endif//!CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
    28. quad.tl.texCoords.u=left;
    29. quad.tl.texCoords.v=top;
    30. quad.tr.texCoords.u=right;
    31. quad.tr.texCoords.v=top;
    32. quad.bl.texCoords.u=left;
    33. quad.bl.texCoords.v=bottom;
    34. quad.br.texCoords.u=right;
    35. quad.br.texCoords.v=bottom;
    36. quad.bl.vertices.x=(float)(i*m_uItemWidth);
    37. quad.bl.vertices.y=0;
    38. quad.bl.vertices.z=0.0f;
    39. quad.br.vertices.x=(float)(i*m_uItemWidth+m_uItemWidth);
    40. quad.br.vertices.y=0;
    41. quad.br.vertices.z=0.0f;
    42. quad.tl.vertices.x=( quad.tl.vertices.y=(float)(m_uItemHeight);
    43. quad.tl.vertices.z=0.0f;
    44. quad.tr.vertices.x=( quad.tr.vertices.y=(float)(m_uItemHeight);
    45. quad.tr.vertices.z=0.0f;
    46. m_pTextureAtlas->updateQuad(&quad,i);
    47. 所以图片上的字符排列顺序要按照ASCII码表的顺序连续排列。CCLabelAtlas的绘制效率高,但是限制性太多,没有CCLabelBMFont灵活。

      从类结构图可以看到CCMenuItemLabel有两个子类CCMenuItemAtlasFontCCMenuItemFont,CCMenuItemAtlasFont是使用CCLabelAtlas创建MenuItemLabel的辅助类,CCMenuItemFont是使用CCLabelTTF创建MenuItemLabel的辅助类。如下源码所示:

      copy
        boolCCMenuItemAtlasFont::initFromString(char*value,charstartCharMap,CCObject*target,SEL_MenuHandlerselector)
      1. CCAssert(value!=NULL&&strlen(value)!=0,"valuelengthmustbegreaterthan0");
      2. CCLabelAtlas*label=newCCLabelAtlas();
      3. label->initWithString(value,charMapFile,itemWidth,itemHeight,startCharMap);
      4. label->autorelease();
      5. if(CCMenuItemLabel::initWithLabel(label,target,selector))
      6. //dosomething?
      7. returntrue;
      8. boolCCMenuItemFont::initFromString( CCAssert(value!=NULL&&strlen(value)!=0,"Valuelengthmustbegreaterthan0");
      9. m_strFontName=_fontName;
      10. m_uFontSize=_fontSize;
      11. CCLabelTTF*label=CCLabelTTF::labelWithString(value,m_strFontName.c_str(),(float)m_uFontSize);
      12. //dosomething?
      13. true;
      14. }
      2. CCMenuItemSprite和CCMenuItemImage :本质上都是使用图片创建菜单项,前者是使用精灵对象创建,后者使用图片名称创建,CCMenuItemImage是CCMenuItemSprite的子类。可以使用三套图片:未选中状态、选中状态、不可用状态,前面两种状态的图片是必需的,不可用状态的图片可选。如下代码所示:
      copy
        staticCCMenuItemSprite*itemFromNormalSprite(CCNode*normalSprite,CCNode*selectedSprite,CCNode*disabledSprite=NULL);
      1. staticCCMenuItemImage*itemFromNormalImage(char*normalImage,87); background-color:inherit; font-weight:bold">char*selectedImage);
      2. char*selectedImage,87); background-color:inherit; font-weight:bold">char*disabledImage);

      3. CCMenuItemToggle : 开关菜单
      它是一个容器,可以切换包含的子项(可以是任何的MenuItem对象)。它封装了一个CCMutableArray<CCMenuItem*>*类型的属性m_pSubItems。代码示例:
      copy
        staticCCMenuItemToggle*itemWithTarget(CCObject*target,SEL_MenuHandlerselector,CCMenuItem*item,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMenuItemToggle*item1=CCMenuItemToggle::itemWithTarget( CCMenuItemFont::itemFromString("On"),
      1. CCMenuItemFont::itemFromString("Off"),NULL);


      b. 分析了菜单的各个相关类的原理和用法后,现在来看看如何使用它们,下面示例代码整合了各种菜单项的创建:
      copy
        voidMenuLayer::onEnter()
      1. CCLayer::onEnter();
      2. CCSizewinSize=CCDirector::sharedDirector()->getWinSize();
      3. /**---CCMenuItemLabel:由指定的字符串标签创建菜单--**/
      4. //CCMenuItemFont:内部使用CCLabelTTF
      5. CCMenuItemFont::setFontName("Arial");
      6. CCMenuItemFont::setFontSize(22);
      7. CCMenuItemFont*pFontMenuItem=CCMenuItemFont::itemFromString("fontitem",menu_selector(MenuLayer::menuCallback));
      8. CCMenu*pFontMenu=CCMenu::menuWithItems(pFontMenuItem,NULL);
      9. pFontMenu->setPosition(ccp(winSize.width/2,winSize.height-30));
      10. this->addChild(pFontMenu);
      11. //CCMenuItemAtlasFont:内部使用CCLabelAtlas
      12. CCMenuItemAtlasFont*pAtlasFontMenuItem=CCMenuItemAtlasFont::itemFromString("123456789",s_imgPathNum,15,19,'0',108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMenu*pAtlasFontMenu=CCMenu::menuWithItems(pAtlasFontMenuItem,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> pAtlasFontMenu->setPosition(ccp(winSize.width/2,winSize.height-60));
      13. this->addChild(pAtlasFontMenu);
      14. //CCLabelBMFont
      15. CCLabelBMFont*pBMFontLabel=CCLabelBMFont::labelWithString("configuration",s_imgPathBMFont);
      16. CCMenuItemLabel*pItemBMFontLabel=CCMenuItemLabel::itemWithLabel(pBMFontLabel,menu_selector(MenuLayer::menuCallback));
      17. CCMenu*pBMFontMenu=CCMenu::menuWithItems(pItemBMFontLabel,NULL);
      18. pBMFontMenu->setPosition(ccp(winSize.width/2,winSize.height-90));
      19. this->addChild(pBMFontMenu);
      20. /**--CCMenuItemSprite:由指定的精灵类创建菜单--**/
      21. CCSprite*spriteNormal=CCSprite::spriteWithFile(s_imgPathMenuItem,CCRectMake(0,23*2,115,23));
      22. CCSprite*spriteSelected=CCSprite::spriteWithFile(s_imgPathMenuItem,23*1,23));
      23. CCSprite*spriteDisabled=CCSprite::spriteWithFile(s_imgPathMenuItem,23*0,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMenuItemSprite*pMenuItemSprite=CCMenuItemSprite::itemFromNormalSprite(spriteNormal,spriteSelected,spriteDisabled,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMenu*pSpriteMenu=CCMenu::menuWithItems(pMenuItemSprite,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> pSpriteMenu->setPosition(ccp(winSize.width/2,winSize.height-120));
      24. this->addChild(pSpriteMenu);
      25. //CCMenuItemImage:由指定的图片文件名创建菜单
      26. CCMenuItemImage*pMenuItemImage=CCMenuItemImage::itemFromNormalImage(s_imgPathCloseNormal,s_imgPathCloseSelected,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCMenu*pImageMenu=CCMenu::menuWithItem(pMenuItemImage);
      27. pImageMenu->setPosition(ccp(winSize.width/2,winSize.height-150));
      28. this->addChild(pImageMenu);
      29. //CCMenuItemToggle:开关菜单,切换效果
      30. //这里只使用了CCMenuItemFont,还可以使用其他的CCMenuItem
      31. CCMenuItemToggle*pMenuItemToggle=CCMenuItemToggle::itemWithTarget( NULL);
      32. CCMenu*pToggleMenu=CCMenu::menuWithItems(pMenuItemToggle,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> pToggleMenu->setPosition(ccp(winSize.width/2,winSize.height-180));
      33. this->addChild(pToggleMenu);
      34. 运行效果如下:

        程序使用的图片素材:

        CCLabelBMFont代码段使用的素材是:cocos2d-x安装目录/tests/Resources/fonts/bitmapFontTest3.fnt和对应的png文件

        ps:CCMenuItem默认使用的字体是Marker Felt,字体大小是32,在CCMenuItem.h中定义了:

        copy
          #definekCCItemSize32
        1. staticunsignedint_fontSize=kCCItemSize;
        2. staticstd::string_fontName="MarkerFelt";

        转载请注明来自:Alex Zhou,本文链接:http://codingnow.cn/android/832.html

        版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

        相关推荐


            本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
        Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
        第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
            Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
        1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
           Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
         下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
        分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
        1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
        原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
        2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
        原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
        环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
        1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
        原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
        原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
        为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
        Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
        需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
        v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是