(32)-cocos2d-x & javascript跨平台初体验

最后更新于:2022-04-01 20:00:08

近日,cocos2d家族开始了版本的联合发布,也就是说从cocos2d-x的2.1版本开始,终于可以实现广大开发者期盼已久的一套代码横跨ios,android和html5的梦想了,这次联合发布的包括cocosBuilder,cocos2d-iphone,cocos2d-x和cocos2d-html5版本,这篇文章就是笔者对这套开发工具的初体验经验总结。使用的是第二次联合发布的cocos2d-x的2.1.1版本。 首先是从cocosbuilder中创建项目工程,然后导出的过程,首先创建工程,如图所示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f16072bc.png) 这个模板工程是这样一个界面,带有写好的js逻辑,点击按钮标题会旋转,然后在菜单中选择导出设置,设置导出的类型和支持的分辨率。  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f162ba33.png) 可以选择的包括android,ios和html5,然后在菜单中选择“Publish”就可以分别导出这三种平台需要的资源目录了,如图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f164abfe.png) 然后就是把这三个文件夹中的资源文件分别在三个平台上运行,首先是ios平台,直接使用cocos2d-x就可以,首先创建cocos2d-x的js项目  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1664415.png)    然后就是把xcode的cocos2dx-js模板项目中的js文件和ccb文件替成新的就可以了,这里有几个地方是需要注意的。 1)这个项目里只有一个启动类AppDelegate,但是替换js时AppDelegate的入口js文件需要修改的,位置很容易找到。 2) 在项目里引入js文件时,xcode不会自动把js文件打入到包里,这样就会出现找不到js文件的情况,我们需要做的就是手动的修改一下,在项目的Build Phase设置里面,有个Copy Bundle Resources项目,手动把js文件添加进去。                ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f168aaed.png)    编译运行,效果如图所示          ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f16a8d86.png) 接下来是android平台上的运行,关于android平台开发环境的搭建,请参考cocos2d-x的官方文档  [http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Setting_up_Android_Development_Environment_on_Mac_OSX#Setup-Eclipse-in-MBP-Retina](http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Setting_up_Android_Development_Environment_on_Mac_OSX#Setup-Eclipse-in-MBP-Retina) 值得一提的是,google在eclipse的基础上为android创建了一个集成的开发环境Android Developer Tools,虽然就是以前的eclipse+adt插件+sdk的集合,但是这样的集合也省去了我们配置的时间,另外需要说明的是文档中提到的定义环境变量的问题,需要首先运行pico .bash_profile命令,另外第一行的环境变量名称应该是ANDROID_SDK_ROOT。配置好了环境以后我们就可以运行build_native来编译,需要注意的就是 1)编译的Android.mk文件和Application.mk都需要修改,可以参考Sample下的javascript项目,需要增加一些内容。 2)assert文件夹虽然是自动生成的,但是需要做一项额外的工作,就是把引擎目录或者是lib目录下,“scripting\javascript\bindings\js”目录下的js文件拷入到你的assert目录下,如果你觉得这样麻烦,也可以修改build_native,可以参考Sample下的javascript项目的build_native写法自动把这些文件拷近来,总之这一步是必须的。 3)最后便可以像文档中所说的,在elipse做最后的联机调试,需要说明的是,我在模拟器上运行是报错的,需要用真机调试,我使用的是HTC-G7调试,这个页面的帧率在58左右,跑cocos2dxjs自带的模板时,有很多西瓜的那个页面帧率基本是30-40,可以看出js在android上的效率还是不错的。                               ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f16c8c25.png) 最后是html5版本,关于cocos2D-html5的环境搭建,请参照我之前的文章: [http://blog.csdn.net/bill_man/article/details/7668516](http://blog.csdn.net/bill_man/article/details/7668516) 在mac上的搭建也是大同小异,下载最新的cocos2D-html5版本然后解压,将目录下的全部文件拷贝到xampp的目录htdocs下,然后在CocosDragonJS同级的目录下创建一个GameClientJS目录,并把Published-html5文件夹拷入,然后启动xampp,输入地址运行cocos2d-html5目录下的index.html页面:                        ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f16e406d.png) 我加了一个GameClientJS的链接,点击这个链接运行ameClientJS\Published-html5目录下的index.html页面。                         ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f170c4a8.png) 如有错误之处,欢迎指正。
';

(31)2.1新特性CCPhysicsSprite

最后更新于:2022-04-01 20:00:06

本篇文章继续介绍cocos2D-x 2.1的新特性:CCPhysicsSprite 和CCPhysicsDebugNode,从名称上就可以看出来这两个类是和物理引擎相关的类,和之前介绍的CCDrawNode一样,CCPhysicsSprite 没有提供新功能,而是对之前功能的一个封装。 CCPhysicsSprite 定义一个物理类绑定的精灵,它继承自CCSprite精灵类,它的使用来看一下TestCpp项目,CCPhysicsSprite 支持目前cocos2D-x中的box2D和chipmunk两个物理引擎,但是你只能使用定义预编译的宏变量CC_ENABLE_CHIPMUNK_INTEGRATION 或CC_ENABLE_CHIPMUNK_INTEGRATION中的一个来使用**box2D或chipmunk****其中的一个**,你可以通过两种方式来设置CC_ENABLE_CHIPMUNK_INTEGRATION 或CC_ENABLE_CHIPMUNK_INTEGRATION的值,一种是在xcode的building setting中设置,如图所示 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f15a6831.png) 另一种是在Config.h文件中设置,如图所示 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f15cbd2d.png) 对于TestCpp这个项目,这里需要说一句就是把引擎变成box2D后编译项目会报错,是因为没有对ChipmunkTest项目加入预编译的判断,对于该部分,我做了修改,下载地址:http://download.csdn.net/detail/bill_man/5012842 回到正题,介绍CCPhysicsSprite 和CCPhysicsDebugNode的使用,CCPhysicsSprite 只需要按照CCSprite的方法定义,然后将之前按照Chipmunk方式定义的body设置给精灵就可以了,代码如下: ~~~ CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 85, 121)); parent->addChild(sprite); sprite->setBody(body); sprite->setPosition(pos); ~~~ 可以打开2.1 之前的版本的相同位置的文件(名称可能不同),可以看到当时我们要自己定义一个精灵类并且完成坐标的对应,有了CCPhysicsSprite之后就会更方便的使用。 CCPhysicsDebugNode是为了更方便debug的类,将它设置为显示之后,在场景内定义的精灵的碰撞形状块就显示出来了,如图所示 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f15e49ae.png) 在这个例子中,点击Toggle debug就可以切换CCPhysicsDebugNode的显示和隐藏,定义CCPhysicsDebugNode的代码如下: ~~~ m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace); this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG); ~~~ 传入的参数是cpSpaceNew类实例,默认创建的一个CCPhysicsDebugNode是显示的,可以通过setVisible函数来控制它的显示与隐藏,需要说明的是CCPhysicsDebugNode目前只支持Chipmunk。 CCPhysicsSprite在Box2D中的使用和Chipmunk类似(在TestCpp中的Box2DTest中),只是多了一个函数需要设置,就是PTMRatio,即“cocos2D-x中的像素到box2D中的meters单位的转换比率” ~~~ CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture,CCRectMake(32 * idx,32 * idy,32,32)); parent->addChild(sprite); sprite->setBody(body); sprite->setPTMRatio(PTM_RATIO); sprite->setPosition( ccp( p.x, p.y) ); ~~~ 在Box2DTest中还保留着之前为了使用box2D而定义的精灵类的代码,可以对比一下现在的使用,确实是方便很多了 对于CCPhysicsSprite的使用,有一些限制: 1)Scale 和Skew属性是忽略的,也就是说setScale或者setSkew后碰撞的形状块大小等不会改变。 2)Position 和rotation属性是有效的,如果你手动设置Position 和rotation,负责控制碰撞的形状块的位置和旋转角度会改变。 3)一个项目中同时只能支持Chipmunk和Box2D中的一个 如有错误,请多多指教,欢迎大牛拍砖
';

(30)2.1新特性之CCClippingNode

最后更新于:2022-04-01 20:00:04

        从本篇起介绍一些cocos2d-x的新功能,包括CocosBuilder动画等功能,还包括从2.1版本添加的一些新特性,本篇文章就介绍一下2.1中我非常喜欢的一个新特性--可以根据一个模板切割图片的节点--CCClippingNode。这个类提供了一种不规则切割图片的方式,在这种方式以前,我们可以使用纹理类自带的setTextureRect函数来切割矩形区域,这种方式就像是J2me的setClip方法一样整块的切割图片,比如我们要实现一个血条的时候,就可以使用这种方式进行切割,切掉我们不想显示的部分,而新特性中提供的CCClippingNode最大的不同之处就是裁减将不仅仅局限于矩形,可以根据任何形状进行裁减,而你要做的只是给一个“裁减模板”,这就好比是我们用剪刀剪形状,需要一个模具类的东西,然后我们拿着模具和要被裁减的纸顺着模具的边缘用剪刀剪就可以剪出一个模具的样子一样,首先来看这个类的常用函数(需要说明的是,这里介绍的函数只是这个类独有的,这个类继承自CCNode节点类,因此节点类有的函数也就不做介绍了): [getStencil](#):返回一个节点对象,这个对象就是之前提到的“裁减模板”。 [setStencil](#):设置“裁减模板”。 [getAlphaThreshold](#)::这种裁减是可以改变裁减的透明度的,修改这个透明度就是通过设置这个阈值。 [setAlphaThreshold](#):获得这个透明度阈值。 isInverted:之前说过的剪刀剪形状的例子,剪完形状以后,是显示被剪掉的部分,还是显示剩余的部分呢,默认isInverted值是false,是显示被剪掉的部分,设置为true则是显示剩余的部分。这个函数获得这个值。 [setInverted](#):设置isInverted值。 使用这个效果,一般的过程是这样的: ~~~ //创建“裁减模板”     CCNode*stencil = this->stencil();     stencil->setTag( kTagStencilNode);     stencil->setPosition( ccp(50,50) );     //创建裁减节点类     CCClippingNode*clipper = this->clipper();     clipper->setTag( kTagClipperNode);     clipper->setAnchorPoint(ccp(0.5,0.5));     clipper->setPosition( ccp(s.width / 2 -50, s.height/ 2 - 50) );     //为设置裁减节点类设置“裁减模板”     clipper->setStencil(stencil);     this->addChild(clipper);     //设置裁减节点类所放的内容     CCNode*content = this->content();     content->setPosition( ccp(50,50) );     clipper->addChild(content); ~~~ 通过这个新特性可以实现出很多有意思的效果,首先来学习一下cocos2D-x中的testApp的使用实例首先是一个类似ScrollView的滚动效果,在这之前,介绍cocos2D-x的另一个新特性—CCDrawNode,这个类不是一个新的功能,而是对原来功能的封装,在这之前,如果我们需要绘制矩形,圆形,点等形状,需要重新写一个类继承自节点或布景层,然后重写draw函数,现在使用CCDrawNode,可以直接使用这个类来绘制相应图形,相关函数如下所示: [drawDot](#):绘制点,参数给出坐标位置。 [drawSegment](#):绘制片断,给出起始点,结束点,半径等参数。 drawPolygon:绘制矩形,可以分别给出填充颜色和边框颜色,还可以设置边框宽度。 实现类似ScrollView的滚动效果的代码如下: ~~~    //创建裁减节点类     CCClippingNode *clipper= CCClippingNode::create();     clipper->setTag( kTagClipperNode);     clipper->setContentSize( CCSizeMake(200, 200) );     clipper->setAnchorPoint( ccp(0.5, 0.5) );     clipper->setPosition( ccp(this->getContentSize().width / 2, this->getContentSize().height/ 2) );     clipper->runAction(CCRepeatForever::create(CCRotateBy::create(1, 45)));     this->addChild(clipper);     //创建“裁减模板”     CCDrawNode*stencil = CCDrawNode::create();     CCPointrectangle[4];     rectangle[0]= ccp(0, 0);     rectangle[1]= ccp(clipper->getContentSize().width,0);     rectangle[2]= ccp(clipper->getContentSize().width,clipper->getContentSize().height);     rectangle[3]= ccp(0, clipper->getContentSize().height);     //绘制一个矩形     ccColor4Fwhite = {1, 1, 1, 1};     stencil->drawPolygon(rectangle,4, white, 1, white);     //为设置裁减节点类设置“裁减模板”     clipper->setStencil(stencil);     //设置裁减节点类所放的内容     CCSprite*content = CCSprite::create(s_back2);     content->setTag( kTagContentNode);     content->setAnchorPoint( ccp(0.5, 0.5) );     content->setPosition( ccp(clipper->getContentSize().width / 2, clipper->getContentSize().height/ 2) );     clipper->addChild(content); ~~~ 之后使用触摸控制的三个函数设置content的位置就可以了,效果如图所示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f156abd5.png) 如果说关于ScrollView是一个已经有解决方案的办法了,那么下面这个效果将更加体现这个新效果的作用,实现一个子弹打孔的效果: ~~~ voidHoleDemo::setup() {     //子弹击穿的图片,很多地方都用到的ABCD图     CCSprite*target = CCSprite::create(s_pPathBlock);     target->setAnchorPoint(CCPointZero);     target->setScale(3);     //创建CCClippingNode,这个CCClippingNode并不是负责切割弹孔的,负责切割出“ABCD图”的     m_pOuterClipper= CCClippingNode::create();     m_pOuterClipper->retain();     CCAffineTransformtranform = CCAffineTransformMakeIdentity();     tranform= CCAffineTransformScale(tranform, target->getScale(), target->getScale());         m_pOuterClipper->setContentSize( CCSizeApplyAffineTransform(target->getContentSize(),tranform));     m_pOuterClipper->setAnchorPoint( ccp(0.5,0.5) );     m_pOuterClipper->setPosition( ccpMult(ccpFromSize(this->getContentSize()), 0.5f) );     m_pOuterClipper->runAction(CCRepeatForever::create(CCRotateBy::create(1, 45)));         m_pOuterClipper->setStencil( target);     //负责弹孔切割的CCClippingNode     CCClippingNode *holesClipper= CCClippingNode::create();     //显示切割后剩余部分     holesClipper->setInverted(true);    //设置alpha阈值     holesClipper->setAlphaThreshold( 0.05f );     holesClipper->addChild(target);     //弹孔层,所有弹孔都在这个节点中     m_pHoles= CCNode::create();     m_pHoles->retain();         holesClipper->addChild(m_pHoles);     //负责切割弹孔的“裁减模板”     m_pHolesStencil= CCNode::create();     m_pHolesStencil->retain();     holesClipper->setStencil( m_pHolesStencil);         m_pOuterClipper->addChild(holesClipper);         this->addChild(m_pOuterClipper);              this->setTouchEnabled(true);    }     点击某一点后,该点出现击穿效果:     //大小旋转随机     floatscale= CCRANDOM_0_1() * 0.2 + 0.9;     floatrotation = CCRANDOM_0_1()* 360;     //弹孔上的效果图片,只是作为装饰     CCSprite*hole = CCSprite::create("Images/hole_effect.png");     hole->setPosition( point);     hole->setRotation( rotation);     hole->setScale( scale);         m_pHoles->addChild(hole);     //真正的弹孔切割     CCSprite*holeStencil = CCSprite::create("Images/hole_stencil.png");     holeStencil->setPosition( point);     holeStencil->setRotation( rotation);     holeStencil->setScale( scale);         m_pHolesStencil->addChild(holeStencil);     //被“击打”的“abcd图”缩放一下,效果更真实      m_pOuterClipper->runAction(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f,0.95f),CCScaleTo::create(0.125f,1))); ~~~ 效果如图所示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1589766.png) 我觉得这个功能很有意思,打算写个游戏实例,过一段时间会发在博客上。   如有错误,请多多指教,欢迎大牛拍砖
';

(29)-cocosBuilder

最后更新于:2022-04-01 20:00:02

cocosBuilder编辑器正是作为可视化编辑的补充,成为cocos2D-iphone和cocos2D-x的可视化编辑器,cocos2D-x从2.0版本开始支持cocosBuilder,同样cocosBuilder也是2.0版本与之对应,本篇来就介绍cocoBuilder编辑器的使用和将cocosBuilder工程倒入到cocos2D-x的程序工程里。 可以通过cocosBuilder的官方网站[http://cocosbuilder.com/](http://cocosbuilder.com/)下载cocosBuilder,下载后解压下载文件双击便可运行cocosBuilder,同样cocosBuilder的使用范例也可以在官方网站上下载到,运行效果如图所示。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f14c572e.PNG) 可以通过file中的选项新建工程或者打开工程。![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f14eec6b.PNG) 可在场景中添加得对象包括:布局文件(可以把某个布局文件作为某界面的子项使用,可以重用这部分布局)、控件、标签、布景层、颜色布景层、渐变布景层、菜单,菜单项类,节点类、粒子系统、精灵类和滚动视图类等等,可以直接加入场景或者作为子项来加入布景层中,并且可以编辑他们的属性,可以移动和对齐子项等等。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f151d04f.PNG) 在程序中使用时,可以通过CCLayerLoader类注册CCNodeLoaderLibrary,再通过CCNodeLoaderLibrary类定义CCBReader类的实例,再通过readNodeGraphFromFile函数获得父节点,并把父节点加入到场景中,即可以显示出相应的场景。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1555c04.PNG) 可以通过重写通过onResolveCCBCCControlSelector函数来将我们在编辑器中定义的相应按钮时指定的函数名对应为本类中的相应的函数名也可以通过onAssignCCBMemberVariable函数将场景中的某个节点对应为本类中的某个变量名。 相信未来cocos2dbuilder可以提供更好的功能,成为cocos2d系列引擎的开发辅助工具。 如有错误之处,希望大家多多指正
';

(28)–CCTMXTiledMap

最后更新于:2022-04-01 19:59:59

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 之前的瓦片地图集那篇当中讲解过地图有关类CCTMXTiledMap,但是还不够详细,在进行完一系列和该类有关的实例编写和讲解后,觉得有必要把CCTMXTiledMap补充进基础知识部分。首先看api ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f14b2459.gif) 可以看到,CCTMXTiledMap继承于CCNode,这样addchild等cocos2d-x中的基本类都可以使用。 首先来看声明及初始化CCTMXTiledMap CCTMXTiledMap *map = CCTMXTiledMap::tiledMapWithTMXFile("iso-test-zorder.tmx"); 很简单,参数就是通过Tiles工具生成的.tmx文件(这个工具及其用法请看之前的瓦片地图集那一节,这里就不再赘述了)。如果初始化了一个地图,我们就可以通过addChild(map, 0, kTagTileMap)把它加入到我们的层次和场景中,然后要在该场景中获得这个地图实例,我们可以通过CCTMXTiledMap* map = (CCTMXTiledMap*) getChildByTag(kTagTileMap)来获得。 CCTMXTiledMap中的每一个tile都是CCSprite类型的,但是这个CCSprite并不是一直存在,而是当我们的程序中需要控制一个图素时(更改图素等),我们通过以下这个语句获得图素的CCSprite: CCSprite *newadd = layer->tileAt(aimmapindex); 参数就是图素的横纵坐标索引值,获得这个CCSprite后,我们就可以控制这个CCSprie旋转,缩放,或者是给他挂上各种Action(通过runAction) 我们可以通过map->getMapSize().width和map->getMapSize().height获得地图横纵的图素个数。 我们可以通过map->getTileSize().width和map->getTileSize().height获得地图图素的宽高。 我们可以通过map->getContentSize().width和map->getContentSize().height获得整体地图的宽高。但是这个有个问题,就是当我们进行整个的地图缩放的时候,这个宽高值不会变化,我们必须通过map->getScale()获得缩放参数并把它乘以宽高及获得真实宽高。 关于地图的gid,我对gid的理解就是每个图素的索引,也就是说改变这个位置的gid值就改变了这个位置的图素图片,我们可以通过layer->tileGIDAt(ccp(mapindex.x,mapindex.y));来获得在某个位置的地图gid。并且可以通过layer->setTileGID(4,aimmapindex);设置某个位置的gid值,其中第一个参数为要设置的gid,第二个参数是本位置的宽高索引。 Gid还有个用途就是获得地图的属性值,这个属性值是通过Tiles工具来设置,用法如下: ~~~ CCMutableDictionary *tiledic = map->propertiesForGID(tilegid); CCString *mvalue = tiledic->objectForKey("conflict"); int mv = mvalue->toInt(); ~~~ 获得的是个键值对,然后把它转变为我们需要的类型。 如有错误之处,希望大家多多指正
';

(27)–CCMutableArray

最后更新于:2022-04-01 19:59:57

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在写cocos2d-x游戏示例的时候,如果发现一些在初探笔记中的遗漏之处,我会随时补充上来,今天补充的就是cocos2d-x中带有的vector----CCMutableArray,我很推荐在cocos2d-x引擎中不使用vector,而是直接使用CCMutableArray,因为它的内存管理方式和cocos2d-x很接近,更方便我们使用,剩下的部分,它也是支持template的,和vector一样。我们首先来看一下创建方法 CCMutableArray* path = new CCMutableArray(); 我们可以使用自己创建的类作为template,这里是我准备写游戏示例的A星算法中准备用到的部分,我使用了自己的template-----AstarItem(我会在游戏示例中解释这个例子) 以下是这个类常用的一些方法: ~~~ path->addObject(temp1);//添加一个对象,添加到最尾部 path->containsObject(temp);//数组中是否包含这个元素 path->copy();//复制这个数组 path->count();//数组中的元素个数 path->getIndexOfObject(temp1);//获得数组的索引 path->getLastObject();//获得最后一个对象 path->getObjectAtIndex(i);//根据索引获得相应的对象 path->insertObjectAtIndex(close->getObjectAtIndex((path->getObjectAtIndex(0))->getfid()),0);//在索引位置插入一个元素 ~~~ CCMutableArray也可以使用Iterator,例子如下。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f148e552.gif) 同样的cocos2d-x还提供了一个数组的使用就是CCArray,其使用方法和Array类似,初始化方法如下  CCArray* sprites = CCArray::arrayWithCapacity(totalToAdd); 当然还有其他的使用方法,这里就不再赘述了。 这里在解释一下CCMutableDictionary,他是一个键值对,这个类型在地图中获得属性的时候比较常用,这样我们就可以获得相应的键值对,第一个类型是我们可以自定义的,我们这里定义为string类型的,而另外一种类型就必须是CCString *类型的,当然,这个类型被获得后我们可以转换为各种类型。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f149fd35.gif) 如有错误之处,希望大家多多指正
';

(26)–其他(游戏存档,切换高清,图片处理)

最后更新于:2022-04-01 19:59:55

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 到此,cocos2d-x的test范例介绍的差不多了,本系列的文章更新也会暂时暂停,之后会在每周新写一篇cocos2d-x的实例(个人写的一些游戏效果),敬请期待。本篇介绍剩下的一些小知识。 1.游戏存档 游戏存档是游戏中不可缺少的一部分,cocos2d-x引擎中有一种很简单的实现存档的方法CCUserDefault 存入:CCUserDefault::sharedUserDefault()->setStringForKey("uername", "bill_man"); 第一个参数为键值,第二个参数为存入的值,可以存入其他类型的值,如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f141cdcf.gif) 获得:ret = CCUserDefault::sharedUserDefault()->getStringForKey("uername"); CCLog("string is %s", ret.c_str()); 第二行就是用CCLog打印出来信息,也有取出其他类型的值的方法,如下图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1432f7d.gif) 2.切换高清 随着硬件技术的提高,提供了更好的画面,我们可以通过如下的方法来切换高清 CCDirector::sharedDirector()->enableRetinaDisplay(true); 参数是true,就是开启高清,为false就是关闭高清,当然目前应该是iphone4和itouch4及以上支持这种“视网膜”显示。当你开启这个时,你的游戏图片会自动变为“原图片名(除后缀名+"-hd."+后缀名),如果文件不存在会继续使用原图。 3.图片处理(抗锯齿,minmap) 当我们缩放图的时候,我们总会遇到图片出现失真和锯齿的时候,cocos2d-x支持一些方法可以解决这些问题 (1)加入抗锯齿,解决放大时的锯齿 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f144599c.gif) 左边抗锯齿,右边正常,效果队比,左边使用sprite->getTexture()->setAntiAliasTexParameters();就可以达到这个效果,右边使用的是sprite2->getTexture()->setAliasTexParameters(); (2) 使用minmap,缩小时效果会更好,左边使用minmap ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1463482.gif) 如下的方法在定义贴图时生成minmap即可 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f147a23f.gif) 然后用贴图去声明精灵即可 刚开始研究此引擎,如有错误之处,希望大家多多指正、 本专栏到此基本完成全部内容,感谢大家支持,同时多多关注我之后的其他专栏
';

(25)–CCRenderTexture

最后更新于:2022-04-01 19:59:53

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 1.CCRenderTexture 在j2me的手游写法中,我们一般是开一个线程,这个线程每帧更新渲染,再走一遍逻辑,在cocos2d-x中我们可以使用schduler来进行更新逻辑,这一部分之前已经说过。我们也可以控制渲染的部分,就是通过CCRenderTexture,通过CCRenderTexture可以实现更好的效果,这些效果我会在之后的cocos2d-x开发实例专题中有所体现。本部分的博客还是更多的体现test例子 使用CCRenderTexture的过程总结起来一句话,就是首先用begin方法来开始整个控制,采用节点中(比如CCSprite)的visit方法加入到渲染,最后调用end方法来结束整个控制并渲染。 来看一个使用的例子,首先,定义一个CCRenderTexture,参数为宽高 ~~~ m_pTarget = CCRenderTexture::renderTextureWithWidthAndHeight(s.width, s.height); ~~~ 然后他也必须像节点一样放入到场景或层中 ~~~ this->addChild(m_pTarget, -1); ~~~ 然后在需要处理渲染管理时开始 `m_pTarget->begin();` 然后需要渲染的对象调用vist,但是此时还不渲染 `m_pBrush->visit();` 在所有的visit结束后我们再调用CCRenderTexture的end进行真正的画 `m_pTarget->end();` 还有一些CCRenderTexture的功能供我们使用,比如清除屏幕中的渲染,如同java的setClip ~~~ m_pTarget->clear(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1()); ~~~ 四个参数为我们清屏的颜色的argb值 另外一个功能就是存储我们的渲染的图片 `m_pTarget->saveBuffer(str,kCCImageFormatPNG);` 第一个参数是文件的路径,第二个参数分别是JPG(0)或者PNG(1) 2.获得贴图数和大小 CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo(); 这句话可以在控制台中显示贴图数和大小(这里首先我们要把引擎中dumpCachedTextureInfo使用的CCLOG改为CCLog,就可以了)控制台中就显示cocos2d: CCTextureCache dumpDebugInfo: 10 textures, for 308 KB (0.30 MB),就可以获得内存中的贴图数和大小信息。 3.提前载入贴图 在很多游戏中,控制图片的载入和释放,可以使我们的游戏更加流畅,我们使用如下的方法载入图片并且回调load函数,在屏幕上显示载入进度 ~~~ CCTextureCache::sharedTextureCache()->addImageAsync("Images/HelloWorld.png", this, callfuncO_selector(TextureCacheTest::loadingCallBack)); ~~~ 这样我们再在游戏中使用这张图片的时候就可以更快的获得,整个的使用方法和更新载入进度信息的函数如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f13f3681.gif) 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下存档
';

(24)–音乐音效

最后更新于:2022-04-01 19:59:50

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在游戏中,音乐是一个不可缺少的部分,音乐分为游戏中的长时间的背景音乐和短的音效两种,可以为我们的游戏增加效果。Cocos2d-x支持多种音乐格式mp3,wav等音乐格式 1.背景音乐 要使用一个音乐,首先要预加载这个音乐,预加载的方法如下 ~~~ SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::fullPathFromRelativePath(MUSIC_FILE) ); ~~~ MUSIC_FILE就是音乐文件相对Res文件夹的相对路径 然后就可以播放了,播放的方法如下 ~~~ SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::fullPathFromRelativePath(MUSIC_FILE)).c_str(), true); ~~~ 第一个参数中的MUSIC_FILE就是音乐文件相对Res文件夹的相对路径,然后再转换为绝对路径,第二个参数就是是否循环播放,由于是背景音乐,我们定为true 其他函数 ~~~ SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();//停止背景音乐,可以代一个布尔型参数,表示是否释放音乐文件 SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();//暂停背景音乐 SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();//重头调用背景音乐 SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()//返回布尔型参数,是否在放着背景音乐 SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);//设置音量0.0-1.0 ~~~ 2.音效 使用音效,和使用音乐类似,也需要预加载,用法如下 ~~~ SimpleAudioEngine::sharedEngine()->preloadEffect( CCFileUtils::fullPathFromRelativePath(EFFECT_FILE) ); ~~~ EFFECT_FILE就是音乐的相对Res文件夹的相对路径 然后播放就可以了 ~~~ m_nSoundId=SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str()); m_nSoundId=SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str(), true); ~~~ 和背景音乐一样,第二个参数是可选的,如果是true就是循环播放,否则就是只播一次 其他函数 ~~~ SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);//停止音效,可以选择单独停掉一个音效,通过创建时的m_nSoundId停止 SimpleAudioEngine::sharedEngine()->stopAllEffects();//停止全部音效 SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);//暂停单个音效 SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);//重新开始音效 SimpleAudioEngine::sharedEngine()->pauseAllEffects();//暂停全部音效 SimpleAudioEngine::sharedEngine()->resumeAllEffects();//重新开始全部音效 SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);//设置音效音量 SimpleAudioEngine::sharedEngine()->unloadEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());//卸载音效 ~~~ 最后要记住,在程序不需要音乐时,要SimpleAudioEngine::sharedEngine()->end();释放sharedEngine() 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下CCRenderTexture
';

(23)–其他(屏幕旋转,schedule,系统语言)

最后更新于:2022-04-01 19:59:48

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 到此,我们的大块知识点已经涉及的差不多了,还有声音(下篇写),之后是一些小的知识点,这次就写一下屏幕旋转,schduler,获得系统语言。 1.屏幕旋转  可以通过getDeviceOrientation和setDeviceOrientation来分别获得屏幕的朝向和设置相应的屏幕朝向。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f13cb10f.gif) 这个例子就是根据屏幕的朝向再通过setDeviceOrientation设置屏幕的朝向,用法很简单,也就不做过多的说明了 2.Schedule 3.在cocos2d-x中有一个按时调一个函数的方法,定义这个以后就会隔一段时间调用一次该方法,直到unschduler 如下,就是注册一个按时调用的方法 schedule(schedule_selector(SchedulerAutoremove::autoremove), 0.5f); 这样autoremove就会按时被调用 unschedule使用方法如下 unschedule(schedule_selector(SchedulerAutoremove::autoremove)); 这样autoremove就不会在被调用了,在kjava游戏当中,经常用线程方法每帧走逻辑和渲染,我们可以用Schduler来实现这种做法 调用CCScheduler::sharedScheduler()->pauseTarget(this);暂停可以暂停全部Schduler 调用unscheduleAllSelectors();或者CCScheduler::sharedScheduler()->unscheduleAllSelectors();可以解除全部Schduler 有一种固定的调用方式,就是scheduleUpdate会在0.01秒左右调用一次update方法(重载) 3.获得系统语言  通过如下的方法,可以获得系统当前的语言 ccLanguageType currentLanguageType = CCApplication::sharedApplication().getCurrentLanguage(); 见下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f13dd0c4.gif) 获得相应语言并显示在屏幕上 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下声音系统
';

(22)–动画类

最后更新于:2022-04-01 19:59:46

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 上一篇主要讲的是精灵类,和精灵类经常配合的就是动画类,动画类也有非常多的特性和应用。 建立动画帧集合,即导入贴图文件.png和导入贴图文件的配置文件.plist,如下例所示 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f133de6f.gif) 首先是获得cache,然后是通过addSpriteFrameWithFile加入贴图文件.png和导入贴图文件的配置文件.plist,第一个参数为.plist的路径,第二个参数为.png文件的路径,一个参数的函数的png文件的文件名与.plist文件相同。也就是说第一个addSpriteFrameWithFile的贴图文件的路径为animations/grossini.png。 关于plist文件,网上有一些工具可以生成,当然你可以使用Zwoptex(需付费),其实只是生成一个配置文件而已,你也可以自己编写这个小工具(本人打算尝试一下),plist文件的结构很像xml等文件,编写一个这样的工具也不是难事。当然,网上也有一些这样的工具。 2.生成逐帧动画CCSpriteFrame,见下图代码 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f134c334.gif) 首先通过CCMutableArray生成一个CCSpriteFrame数组,然后通过循环初始化每一帧的内容,每帧的CCSpriteFrame通过上面定义好的cache获得。 3.生成CCAnimation   这个步骤很简单,就是通过CCSpriteFrame数组生成CCAnimation ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f135e46a.gif) 这个函数有一个可选的参数,就是每帧的延迟,见api ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f136fdd6.gif) 这个就是一个参数的 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1381bf9.gif) 第二个参数就是延迟时间 4.定义并执行CCAnimate  到这一步,终于可以定义动画了,第一个参数是CCAnimation,第二个参数如果置为true那么将在动画结束回到原始帧,否则将不会回到原始帧。如下例 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f139448e.gif) 当然,如果觉得这个步骤繁琐,有一种相对简便的,就是不通过cache,而是从贴图生成每帧的数组,之后的步骤同上。 首先,通过贴图逐帧生成数组,如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f13a3e8a.gif) 然后在生成CCAnimation,进一步再CCAnimate,如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f13b820f.gif) 补充CCSprite的一个知识点,就是通过reorderChild来改变精灵的层次,从而改变遮挡关系 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下schduler和控制屏幕朝向
';

(21)–精灵类

最后更新于:2022-04-01 19:59:44

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在游戏中还有一个比较重要的元素,那就是精灵类,我们可以通过单张图片或者是贴图集的方式来生成精灵。精灵类的用法比较灵活,还有精灵批处理的方法帮助我们创建多个精灵并节约渲染效率。 精灵类的使用  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f12db2c7.gif) 以上就是通过一个图片的一部分来创建精灵类并把它加入到场景中的一个例子,第一个参数是图片的路径,第二个参数是从中划分出来图片的矩形。 1.精灵的批处理 当你需要显示两个或两个以上相同的精灵时,如果逐个渲染精灵时,你的帧率会至少下降15%。你可以使用CCSpriteBatchNode来批处理这些精灵就可以避免帧率的下降,用它来作为父层(类似于layer)来创建子精灵,这样可以提高程序的效率,我们首先来看一下api ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f12ed4c2.gif) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f130a0be.gif) 有两种创建CCSpriteBatchNode的方法,区别主要在第二个参数,第一个参数是贴图集路径,而另一个参数则是子节点的数量,当然,如果你使用第一种方法不显式的定义子节点的数量的话,系统会使用默认值29,在运行时如果超过空间了,会增加33%的容量。使用的方法如下描述。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f131aa99.gif) 首先是定义,就如api中描述的那样,然后加入到场景中。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f132b6a9.gif) 在加入精灵时,只需通过标签来获得CCSpriteBatchNode,然后通过CCSpriteBatchNode的贴图来创建精灵,并把精灵作为子节点加入到CCSpriteBatchNode中。 不过使用CCSpriteBatchNode有一个限制,就是所使用的图片必须来自同一个文件,如果使用一张图片来创建精灵,你将不能指定精灵的深度,这样,所有的精灵都必须在同一渲染层,不过你可以使用贴图集来避免这个问题,如果你的所有贴图都在同一个文件里,那么你只需创建一个CCSpriteBatchNode就可以了。贴图的大小必须满足2的n次方。可以使用Zwoptex工具来制作贴图,这是一个收费软件,我想通过java或者C#写一个类似的拼图软件也不是什么难事,大家可以尝试一下。 2.设置锚点 可以通过setAnchorPoint设置锚点,(0,0)为左下,(0.5,0.5)为中心,(1,1)为右上,依次类推。 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下动画的使用
';

(20)–物理引擎box2d(2)

最后更新于:2022-04-01 19:59:41

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 由于box2d的内容比较多,它也有自己的testbed例子,所以关于比较深入的box2d引擎内容,我准备单开一个专题去研究它的testbed例子,当然,是嵌入到我们的cocos2d中的testbed,因为box2d本身就是用C++编写的,所以区别不是很大。 首先看一下box2dtest这个例子,这个例子相对简单 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1248aec.gif) 就是可以点击屏幕,在屏幕中生成方块,然后方块之间有碰撞,就这么简单,但是带出了整个cocos2d-x的框架。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f126bcbc.gif) 第一步当然是构建整个世界,正如上一节所说的,建立重力,通过重力构建生成世界,当然,这也是使用这个引擎new构建为数不多地方,因为有世界才有一切 第二步就是构建地面及墙壁,这里面的做法略有不同,因为要构建一个空心的物体,因此我们不能直接定义,而是分别定义长方体里的四个边。 另外一个需要注意的地方就是我们进行了长度的转换,由于box2d采取的现实世界的米作为计量长度的单位,这里要注意的是长度范围在0.1m到10m范围内的物体模拟的效果更好,所以我们要把我们的像素级的长度单位转换为米的单位就要除以PTM_RATIO(定义32像素为1米)。 需要说明的是,这里我对例子进行了修改,例子是以屏幕的中心为锚点,而我,是以原点为锚点的,我觉得这样更好理解。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f128a483.gif) 之后使用批处理精灵类管理所有的盒子,先生成格子的定义,在通过定义生成物体 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f129fa7c.gif) 可以看到类型是动态刚体,另外值得注意的就是用userData这个参数保留了我们的对象,从而完成了对象和刚体的绑定 之后再绑定形状,先生成形状,在通过关联来绑定形状 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f12aeadc.gif) 在初始化方法里调用scheduleUpdate()使得模拟出每个时间步更新,并在update中进行更新,如下图所示。Box2d是通过定期调用step来更新动画的,step的第一个参数是时间步,这里我进行了修改,因为dt会不同,所以不建议用dt来作为时间步,而要给他一个固定的时间步这样才不会显得动画时快时慢,第二个参数是速度迭代次数,推荐8次,超过10次的基本看不出效果的提升,第三个参数是位置迭代,这个1次就行,底下的步骤就是遍历整个世界,找出对应精灵的刚体,进行位置更新就可以了 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f12c144c.gif) 关于物理引擎的深入研究,我想再开一个系列的文章来单独谈,因为这个的例子写的也很好,对不同类型游戏的开发都很有用 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇打算写精灵类的深入研究
';

(19)–物理引擎box2d(1)

最后更新于:2022-04-01 19:59:39

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍box2d。 Box2D 是用可移植的 C++ 来写成的。引擎中定义的大部分类型都有 b2 前缀,可以把它和我们游戏中的其他元素区分开来。 Box2d中有很多概念。 1.刚体   即是物理学中的质点,只有位置,没有大小,它又可以区分为以下几类   静态刚体:静态刚体没有质量,没有速度,只可以手动来改变他的位置   棱柱刚体:棱柱刚体没有质量,但是可以有速度,可以自己更新位置   动态刚体:动态刚体有质量也有速度 物理引擎需要首先定义一个描述类,然后再根据描述类通过世界创建某个对象。创建刚体时需要有两个步骤,一是生成一个刚体定义,二是根据刚体定义生成刚体。在刚体创建时定义中的信息会被复制,也就是说创建完成后刚体只要没被释放掉,就还可以重复使用。 ~~~ //定义刚体 b2BodyDef groundBodyDef; groundBodyDef.position.Set(screenSize.width/2/PTM_RATIO, screenSize.height/2/PTM_RATIO); //生成刚体 b2Body* groundBody = world->CreateBody(&groundBodyDef); ~~~ 2.形状   通过关联添加到刚体上,碰撞可以根据形状来判定,具有摩擦和恢复等材料特性。 ~~~ b2PolygonShape groundBox; // bottom groundBox.SetAsBox(screenSize.width/2/PTM_RATIO, 0, b2Vec2(0, -screenSize.height/2/PTM_RATIO), 0); ~~~ 3.关联  关联是一种附加在刚体上的属性,一个刚体可以有多个关联,创建关联时,需要定义关联的信息,然后通过刚体创建关联,当关联被创建时关联定义中的信息也会被保留,也可以重用 ~~~ //定义并创建关联 b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); ~~~ 4.链接 链接可以联系多个缸体,使得刚体之间相互影响,同样的,也需要首先定义信息,之后通过世界创建链接,同样的,信息也可以被保留,从而重用 另外链接还支持限制和马达,限制就是限制物体运动的角度,马达就是依照关节中的限制来约束物体 链接有旋转,棱柱和距离等 ~~~ b2RevoluteJointDef rjd; rjd.Initialize(m_attachment, m_platform, b2Vec2(0.0f, 5.0f)); rjd.maxMotorTorque = 50.0f; rjd.enableMotor = true; m_world->CreateJoint(&rjd); ~~~ 5.约束   一个约束就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我 们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。 还有一种不须你创建的接触约束,一个防止刚体穿透,以及用于模拟摩擦和恢复的特殊约束。 6.世界   世界是遵循物理的空间,以上的所有都存在于世界中,可以创建多个世界,但很少这样用 创建世界需要两个步骤,一是生成重力向量,二是根据重力生成世界对象 ~~~ //生成重力向量 b2Vec2 gravity; gravity.Set(0.0f, -10.0f); //生成世界对象 bool doSleep = true; world = new b2World(gravity); world->SetAllowSleeping(doSleep); world->SetContinuousPhysics(true); ~~~ 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇继续深入box2d
';

(18)–Lable

最后更新于:2022-04-01 19:59:37

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man Cocos2d-x的提供了几种生成文字标签的方式,方便我们加入到菜单中等 1.CCLabelTTF 这种方法是通过系统文字生成,使用方法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f11aceb1.gif) 还可以生成时指定标签宽度,指定锚点 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f11bd54d.gif) 第一个参数是标签的文字内容,第二个是范围的大小,第三个参数是对齐方式,第四个参数是字库名称,第五个参数是字号,用法举例如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f11ce674.gif) 2.CCLabelAtlas 可以通过自定义的图片来显示文字内容,比如数字字母等 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f11e072d.gif) 第一个参数是标签的文字内容,第二个是对应的图片路径,第三个第四个分别是图片中的每一个元素的宽度和高度,最后一个参数是起始的字符 使用方法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f11f1d7d.gif) 可以通过使用setString来修改标签文字内容 label1->setString(string); 可以通过使用setColor来设置标签的颜色 label2->setColor( ccRED ); 可以通过使用setOpacity设置标签的透明度 label2->setOpacity( 32 ); 可以通过runAction挂动作 CCActionInterval* fade = CCFadeOut::actionWithDuration(1.0f); CCActionInterval* fade_in = fade->reverse(); CCFiniteTimeAction* seq = CCSequence::actions(fade, fade_in, NULL); CCAction* repeat = CCRepeatForever::actionWithAction( (CCActionInterval*)seq ); label2->runAction( repeat ); 3.CCLabelBMFont 同样可以通过自定义的图片来显示文字内容,只是这个更加的灵活,可以自己定义fnt配置文件 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f120df20.gif) 第一个参数是要显示的内容,第二个参数是fnt文件的路径,使用方法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f121e999.gif) 生成fnt配置文件的工具下载地址如下 http://www.n4te.com/hiero/hiero.jnlp (Java平台) http://slick.cokeandcode.com/demos/hiero.jnlp (Java平台) http://www.angelcode.com/products/bmfont/ (Windows平台) 也可以通过使用setString来修改标签文字内容 label2->setString( string ); 可以通过使用setColor来设置标签的颜色 label2->setColor( ccRED ); 可以通过runAction挂动作 CCActionInterval* fade = CCFadeOut::actionWithDuration(1.0f); CCActionInterval* fade_in = fade->reverse(); CCFiniteTimeAction* seq = CCSequence::actions(fade, fade_in, NULL); CCAction* repeat = CCRepeatForever::actionWithAction( (CCActionInterval*)seq ); label2->runAction( repeat ); 可以获得单个字符,并为其挂动作(通过字符的索引获得) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f122e055.gif) 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下物理引擎
';

(17)–瓦片地图集

最后更新于:2022-04-01 19:59:35

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 地图是游戏中不可缺少的元素,cocos2d-x中支持两种瓦片地图集生成的方式,分别是通过.tga文件和.tmx文件(.tga文件已经不是推荐方法,只是为了兼容性的问题继续保留) 1.tga文件 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f110fa5c.gif) 使用方法相对简单,第一个参数是图素文件,第二个参数是tga文件,也就像是地图的图纸一样,后两个参数分别为图素的宽高,tga文件应该是通过photoshop生成,这种方法在现在有tile编辑器的情况下应该已经不太推荐了,效果如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f111f7b4.gif) 1.mx文件 用法类似,只是有了地图图素编辑器以后,地图更方便编辑了,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f114a387.gif) 这个只有一个参数就是tmx文件的路径 地图编辑器的下载地址如下,支持45度角方向和正常方向两个方向,拖动图素向地图编辑区就可以编辑相应地图了,非常方便。 [http://www.mapeditor.org/](http://www.mapeditor.org/) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f115b84d.gif) 两种方式的效果如下 45度角 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f116e69d.gif) 正常 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f118d543.gif) 可以把精灵类加入到地图中并且可以通过改变地图与对象的层次来处理精灵对象与地图的遮挡关系,用法如下: ~~~ //定义对象并加入到地图中 m_tamara = CCSprite::spriteWithFile(s_pPathSister1); map->addChild(m_tamara, map->getChildren()->count() ); //改变在地图中的层次 int newZ = 4 - (p.y / 48); newZ = max(newZ,0); map->reorderChild(m_tamara, newZ); 也可以把精灵放入地图中,然后获得再控制精灵 //获得精灵 CCTMXLayer* layer = map->layerNamed("Trees"); m_tamara = layer->tileAt( ccp(29,29) ); m_tamara->retain(); //通过z轴控制遮挡 m_tamara->setVertexZ( -( (p.y+32) /16) ); ~~~ 可以通过设置摄像机来设置地图的视角 ~~~ map->getCamera()->getEyeXYZ(&x, &y, &z); map->getCamera()->setEyeXYZ(x-200, y, z+300); ~~~ 也可以通过设置动作实现缩放 map->runAction( CCScaleBy::actionWithDuration(2, 0.5f) ) ; 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下test类里面的其他场景
';

(16)–LayerColor

最后更新于:2022-04-01 19:59:32

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man Cocos2d-x的菜单中提供了生成带颜色的Layer的方式,他们都继承于CCLayer,如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f105e4fb.gif) 本来还有一个CCColorLayer,但是他和CCLayerColor一样,在v1.01版本中已经被删去了,这里只讨论CCLayerColor和CCLayerGradient 1.CCLayerColor 就是生成一个带颜色的层,其高度和宽度可以自定义,如下api ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f106fca6.gif) 三个参数就是第一个是color,后两个是宽度和高度 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f107f76b.gif) 没有宽度和高度,默认的就是屏幕的大小,定义的用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f108edfd.gif) 另外可以给Layer加上相应的动作,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f10a0225.gif) 一个是变化颜色,另一个是淡出淡入,用法也是使用先定义动作,再使用runAction。 另外也可以通过setBlendFunc设定过程颜色,用法如下,首先通过gettBlendFunc可以获得ccBlendFunc的起始和结束颜色,然后再通过setBlendFunc设定颜色 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f10afb64.gif) 2.CCLayerGradient 可以生成混合颜色层,是通过定义两个颜色,生成过渡色,效果如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f10c0953.gif) 定义的方法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f10e341b.gif) 如果不设置最后一个参数,中心点将自顶向下渐变 可以通过如下方法是否设置色差压缩,如果可以设置色差压缩将显示起始颜色,否则不显示起始颜色 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f10f28ec.gif) 另外可以通过设置向量来设置中心切分线,用法如下,参数为CCPoint gradient->setVector(diff); 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下test类里面的其他场景
';

(15)–CCOrbitCamera

最后更新于:2022-04-01 19:59:30

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man Cocos2d-x提供了一中根据球面坐标轨迹旋转的方式CCOrbitCamera ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0ff37e3.gif) 参数分别为旋转的时间,起始半径,半径差,起始z角,旋转z角差,起始x角,旋转x角差,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f100ec90.gif) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f101e3eb.gif) 同时该用法也引出了一个问题就是,子节点将继承父节点的动作,也就是说在上述sprite自转的时候,它还有p的公转。以下演示了sp3和sp4作为sp1和sp2的子节点,将继承sp1和sp2的动作。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f1032c90.gif) 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下test类里面的其他场景
';

(14)–菜单项

最后更新于:2022-04-01 19:59:28

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man Cocos2d-x的菜单中提供了多种菜单项的生成方式,他们都继承于MenuItem,如下图 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f7b73d.gif) 1 CCMenuItemLable 包括CCMenuItemAtlasFont和CCMenuItemFont是两种定义菜单项字体的方式,其中CCMenuItemFont是通过设定字体名称来设置字体,这个字体是系统自带的,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f8d3fa.gif) 主要就是设置字体和字号就可以了 CCMenuItemAtlasFont则是通过字体配置文件png文件,即配置文件所对应的图片,用法如下 也可以生成CCLabelAtlas,再以lable的形式放入CCMenuItem中,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f9f268.gif) 另外还可以使用CCLabelBMFont,配置文件使用fnt格式的配置文件,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0fae69c.gif) 2.CCMenuItemSprite 这个菜单项的特点就是可以封装图片进入菜单项,用法如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0fc0652.gif) 也有直接传入图片的路径的CCMenuItemImage ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0fd032f.gif) 2.CCMenuItemToggle CCMenuItemToggle可以将任意的CCMenuItem封装进去,作为一个按钮式的开关 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0fe0ce6.gif) 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下test类里面的其他场景
';

(13)–内存回收机制

最后更新于:2022-04-01 19:59:25

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 之前提到过cocos2d-x的内存回收机制,但是不是很全面,这篇主要写一下release和autorelease的区别,使用autorelease可以简化我们的内存管理,等于将我们的对象放入自动释放池,放入自动对象池的对象会记着你在晚些时候发送的释放信息,因为忘记释放内存有可能会导致内存泄露,当然这样做也有一个缺点,就是当下一帧我们需要再次使用这个对象的时候,我们就会发现我们的对象已经被释放了,就算你把对象作为成员变量,都无法保证不会出现这种错误,这时你有两种办法,第一种办法就是使用retain方法保留,第二种办法就是在addchild的时候,加上tag,然后再当我们需要的时候,我们就可以通过tag再次获得相应的对象即可。 虽然苹果开发者文档建议较少的使用自动释放对象,但是这样做可以方便我们进行内存管理。 和oc一样,cocos2d引擎对于内存管理有些约束,如果你拥有一些对象,你必须在用完之后释放他,如果你使用了autorelease你就不能使用release 使用自动释放的例子 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f457b9.gif) 使用释放的例子 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f58367.gif) 使用保留的例子 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-26_571f3f0f68d92.gif) 刚开始研究此引擎,如有错误之处,希望大家多多指正 下一篇写一下test类里面的其他场景
';