您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > Cocos2dx入门初级教程
Cocos2dxCocos2dxCocos2dxCocos2dx入门初级教程Xucuiping2013.6.13一、总体介绍基于opengl开发cocosd依赖于glew、Libxml2、LibtiffLibxml2是一个C语言开发的的XML开源库,ibxml2库依赖iconv和zlib库。Libtiff是一个用来读写标签图像文件格式(简写为TIFF)的库。Cocos2dFamilyisbelow,上面蓝色的4各分支是同步发布和更新的,有统一的版本。下面是各个分支的具体情况,包括:支持的开发语言、操作系统。iphone版本版本和Cocos2d-iphone两个引擎除了实现语言不同外(Cocos2d-X使用C++,Cocos2d-iphone使用Object-C)可以说没有其他差异。cocos2d-x支持两个物理引擎Box2d和ChipmunkBox2D是一个用于模拟2D刚体物体的C++引擎。Chipmunk是由ScottLembcke在Box2D的基础上开发的。二、cocos2dxcocos2dxcocos2dxcocos2dx主要概念Cocos2dx中的主要概念包括:应用、导演、场景、层、精灵、动画、动作。层次关系如下:三、Cocos2dxCocos2dxCocos2dxCocos2dx主要类(1)CCCCCCCCObjectObjectObjectObject是cocos2dx的主要基类。主要提供了引用计数的功能。CCObject初始化将引用计数设置为1Retain:将引用计数加1Release:将引用计数减1,并且如果引用计数为0的时候delete本对象Autorelease:将本对象加入到垃圾回收其中,并且该对象引用计数m_uReference为1,m_uAutoReleaseCount为1具体分析一下Autorelease方法(比较重要!)(2)CCPoolManagerCCPoolManagerCCPoolManagerCCPoolManager是个单体类,负责管理多个垃圾回收器CCAutoreleasePool在CCObject::Autorelease方法中单体CCPoolManager会将该对象加入到它管理的当前CCAutoreleasePool对象m_pCurReleasePool中,m_pCurReleasePool就是目前生效的垃圾回收器。CCAutoreleasePool通过CCArray*m_pReleasePoolStack可以管理多个垃圾回收器。CCPoolManager通过getCurReleasepool获取当前的垃圾回收器m_pCurReleasePool如果m_pCurReleasePool==NULL,就调用push创建一个新的垃圾回收器。Push方法创建一个新的垃圾回收器,并且加入到动态数组m_pReleasePoolStackPop方法会清理当前的垃圾回收器m_pCurReleasePool,如果有多个垃圾回收器删除当前这个垃圾回收器,最后将m_pReleasePoolStack中下个垃圾回收器设置给m_pCurReleasePool准备后面使用。具体pop方法什么时候使用,先留个伏笔。(3)CCAutoreleasePoolCCAutoreleasePoolCCAutoreleasePoolCCAutoreleasePool垃圾回收器通过使用一个动态数组管理使用CCObject::autorelease加入进来的CCObject对象addObject方法就是将这个CCObject对象加入到动态数组中,在CCArray::addObject方法中调用了CCObject::retain方法将该对象的引用计数加1,这个时候该对象的引用计数为2,最后调用CCObject::release方法将引用计数又减1,最后该对象的引用计数为1这个时候你可能会觉得这个写法好怪异,加1又减1。主要还是由于CCArray的addobject和removeObject是相对方法,在里面会将对象引用计数加1和减1。(4)CCApplicationCCApplicationCCApplicationCCApplicationCCApplication是Cocos2dx应用程序的主类,应用程序需要继承CCApplication。在main函数中需要定义一个CCApplication对象并且执行CCApplication的run方法。在CCApplication的构造函数会将本CCApplication子类对象this赋值给静态成员变量sm_pSharedApplication可以通过sharedApplication获取到CCApplication子类单体对象在CCApplication::run方法中主要工作就是在死循环中一直执行CCDirector::mainLoop方法来渲染所有对象。(5)CCDirectorCCDirectorCCDirectorCCDirector导演类(是cocos2dx应用中很重要的类,主要做场景的管理和调度)CCDirector初始化工作包括:创建一个CCScheduler调度器、CCActionManager对象管理器、CCTouchDispatcher触摸消息分配器、CCKeypadDispatcher键盘消息分配器、CCAccelerometer加速器并且通过CCPoolManager创建一个垃圾回收器。对导演类的使用主要还是通过单体方式。实际上还是引用CCDirector的子类CCDisplayLinkDirector在CCDisplayLinkDirector中最主要的方法就是mainLoop方法在mainLoop方法中主要作两件事:渲染场景、通过CCPoolManager释放和清理当前的垃圾回收器导演类的drawScene方法中,主要做以下几件事:第一:通过调度器刷新执行所有实现了update方法的CCNode对象。(Cocosdx具体调度机制参考下面的具体章节)第二:设置当前的Scene,执行当前Scene的onEnter和onExit方法。第三:通过visit方法开始开始递归渲染当前的Scene(包括添加到该Scene中的所有子对象,并且会执行CCNode::draw方法)第四:Director提供了一种扩展接口:setNotificationNode(参考下面函数实现)可以通过这个方法设置一个非Scene对象到CCDirector中,由CCDirector在主循环方法中递归调度。第五:显示FPS、状态等信息下面是CCDirector::drawScene的实现:CCDirector控制Scene的几个重要方法:CCDirector主要使用动态数组m_pobScenesStack存储管理场景运行当前的Scene,并且将该Scene加入场景数组中替换场景:将该场景作为当前运行的场景(6)CCNodeCCNodeCCNodeCCNodeCCNode最重要的成员方法:创建和释放virtualvoidonEnter();virtualvoidonExit();增加删除子对象virtualvoidaddChild(CCNode*child);virtualvoidaddChild(CCNode*child,intzOrder);virtualvoidaddChild(CCNode*child,intzOrder,inttag);virtualvoidremoveChild(CCNode*child,boolcleanup);//Onlyuse-thisfunctiontodrawyourstuff.DON'Tdrawyourstuffoutsidethismethodvirtualvoiddraw(void);virtualvoidvisit(void);voidtransform(void);//返回所占的矩形空间CCRectboundingBox(void);//运行动作相关CCAction*runAction(CCAction*action);voidstopAllActions(void);voidstopAction(CCAction*action);//调度相关voidscheduleUpdate(void);voidschedule(SEL_SCHEDULEselector);voidschedule(SEL_SCHEDULEselector,floatinterval);voidschedule(SEL_SCHEDULEselector,floatinterval,unsignedintrepeat,floatdelay);voidscheduleOnce(SEL_SCHEDULEselector,floatdelay);voidunschedule(SEL_SCHEDULEselector);这里重点说明一下draw方法:为什么对这个CCNode对象自定义画图,比如画线、画圈等必须在draw方法内执行,不能在其他地方执行。这是因为引擎在这个函数调用的上下文间进行了绘图环境的准备和必要的状态设置。(7777)Cocos2dxCocos2dxCocos2dxCocos2dx常用的常量、工具1》cocoa\CCGeometry.h定义了CCPoint、CCSize、CCRectconstCCPointCCPointZero=CCPointMake(0,0);constCCSizeCCSizeZero=CCSizeMake(0,0);constCCRectCCRectZero=CCRectMake(0,0,0,0);2》NS_CC_BEGIN//这是namespacecocos2d{NS_CC_END//这是}!!!!USING_NS_CC;//这是usingnamespacecocos2d;这可以是常用宏。3》CC_SAFE_DELETE(p);//当p不为NULL,deletep并且将p赋为NULLCC_SAFE_DELETE_ARRAY(p);//...delete[]p..CC_SAFE_FREE(p);//...freep...CC_SAFE_RELEASE(p);//当p不为NULL,p-release()CC_SAFE_RELEASE_NULL(p);//当p不为NULL,p-release()并且将p赋为NULLCC_SAFE_RETAIN(p);//当p不为NULL,p-retain()4》CCRANDOM_0_1();//产生0到1之间的随机浮点数CCRANDOM_MINUS1_1();//产生-1到1之间的随机浮点数5》support\CCPointExtension.h取中点ccpMidpoint(v1,v2);//等价ccp((v1.x+v2.x)/2,(v1.y+v2.y)/2);点乘、叉乘、投影ccpDot(v1,v2);//等价v1.x*v2.x+v1.y*v2.y;ccpCross(v1,v2);//等价v1.x*v2.y-v1.y*v2.x;ccpProject(v1,v2)//返回的是向量v1在向量v2上的投影向量ccpLength(v)//返回向量v的长度,即点v到原点的距离ccpLengthSQ(v)//返回向量v的长度的平方,即点v到原点的距离的平方ccpDistance(v1,v2)//返回点v1到点v2的距离ccpDistanceSQ(v1,v2)//返回点v1到点v2的距离的平方ccpNormalize(v)//返回v的标
本文标题:Cocos2dx入门初级教程
链接地址:https://www.777doc.com/doc-6402904 .html