Cocos2d-X是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C + +cocos2d-iPhone项目的版本。cocos2d-X发展的重点是围绕cocos2d跨平台。即其实现一次编码,再各平台分别编译后即可运行,不许为跨平台修改大量代码,不需要在一直方面花费很多时间和人力,目前cocos2d-x引擎已经可以跨以下平台:
● iOS
● Android
● Windows XP / Windows 7
● Meego
● BlackBerry
● Bada
● Marmalade (原名airplay, 一个c++跨平台框架)
其除跨平台外,相对其它的移动游戏引擎还有以下特点
● 易用性:易于学习掌握的API,大量示例代码和文档,有c++语言功底的新手只需画一个月就能上手完成简单游戏;
● 高效性:使用OpenGL ES 1.1最佳方式进行渲染;
● 灵活性:易于扩展,易于与其他开源库集成使用;
● 活跃的社区:全球化的活跃论坛。
● 成功商用:根据开源社区的保守统计,基于Cocos2d-x开发的游戏全球范围内已经突破一亿安装量。
Cocos2d-x 提供主要功能:
非常容易低进行不同场景之间的流程控制管理
菜单维护简单
支持标签和html标签的文本渲染
快速而方便的精灵
按照你的想法指挥精灵变化,可组合的动作,包括移动、旋转和缩放
支持包括波浪、旋转和透镜等特效
支持矩形和六边形的瓦片地图(Tiled Maps)
支持场景切换特效
支持粒子系统
支持硬件加速,即基于opengl es 1.1实现图形渲染系统
支持音效和背景音乐支持(CocosDenshion库)
基础物理引擎Box2d和chipmunk
根据不同屏幕分辨率自动缩放适配
Lua脚本支持。
关于cocos2d-x中的“X”,“X”有两意思,一个是表示“C++”,因为有时候,C++文件的后缀名可以用cxx代替,因此X便表示该开源项目使用C++编写,并且提供C++的API,二是表示“Cross”,该开源项目的目标是跨更多平台。
·什么是“X”cocos2d-X方式:◦有时候,我们写的cpp文件扩展CXX。“X”,标志着该项目是由C + +中,并提供C + +中的API编写的。 ◦“X”,也意味着交叉。这个开源项目的目标是让用户创建跨平台的代码。目前支持的平台是在iPhone,Android的,WoPhone,Win32平台上,但可根据要求提供更多的平台。
Cocos2d-x其他版本介绍
Cocos2d:是所有cocos2d引擎的家族的鼻祖,最早是有阿根廷一个叫Rcardo Quesada的人用Python脚本写的,其主要用来开发2d游戏和基于2d图形的任何应用,第一次发布是2008年2月29日,官方网站是http://www.cocos2d.org
Cocos2d-iphone:是基于cocos2d的思想开发的,第一版在2008年6月25号发布,其基本是与苹果ios一起成长起来的,凭借着使用object-c语言和SDK的无缝衔接的优势,获得了广大果粉开发者的追捧和喜爱,现在已成为苹果ios上2d游戏引擎的首选。官方网站是http://www.cocos2d-iphone.org
Cocos2d-x for xna :2012年2月17日,著名的开源社区Cocos2d发布Cocos2d-X for XNA版本。该游戏引擎针对微软最新移动操作系统Windows Phone 7平台,开发者可以采用C#语言开发基于Windows Phone平台的游戏,而无需学习XNA绘图接口。据悉,该游戏引擎由Cocos2d-X团队和OpenXLive合作开发。OpenXLive是Windows Phone上最早的游戏社交平台。其下载地址:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download
Cocos2d-windows:cocos2d的windows实现,使用GPL V3协议发布,该分支是由一位韩国人所在,但和大多数开源项目一样,在一次较大范围的提交之后就无小心了,没有留下文档,也没有更新,官方网站是:http://code.google.com/p/cocos2d-windows
Cocos3d:cocos2d的3D实现,由加拿大人Bill Holling开发和维护,cocos3d不是一个完全的3d引擎,而是在cocos2d的CCLayer层上面扩展出3d世界,以cocos2d-ihpone扩展包的形式运行,官方网站是:http://www.cocos3d.org
Cocos2d-andoid:是cocos2d的java实现,并且能够在Android上运行,使用BSD协议发布,官方网站是http://code.google.com/p/cocos2d-android
Cocos2d-javscript:cocos2d的javascript实现,由一个新西兰程序员建立和维护,其把cocos2d整套框架一到了Html5和javascript上面了,官方网站是:http://cocos2d-javascript.org
不过目前在cocos2d-x官方上已经有cocos2d-html5发布了。
ShinyCocos:把cocos2d-iphone绑了ruby实现,官方网站:http://github.com/funkaster/shinycocos
Cocos2d-x学习之 整体框架描述
1.Cocos2d-x 整体描述
和传统的游戏引擎一样,cocos2d-x作为一个2d的游戏引擎,其也有以下几大概念组成:
导演(CCDiretor):
在cocos2d-x引擎中,CCDirector类是整个游戏的组织和控制核心,游戏的运行规则,游戏内的CCScene(场景)、布景(CCLayer)、角色(CCSprite)等的运动,均由CCDirector管理,其在游戏中起着指定游戏规则让游戏内的场景、布景和任务有序的运行。在整个游戏里面,一般只有一个导演,游戏开始和结束时,都需要调用CCDirector的方法完成游戏初始化或销毁工作,其提供了一些场景管理的方法,如runWithScene、DrawScene、pushScene和replaceScen等。
它控制FPS的显示隐藏,窗口大小,游戏的进入,退出,关卡的切换,取得正交模式,取得正在运行的场景,取得GL视图,游戏主循环入口等等
摄像机(CCCamera)
游戏中每个节点都需要摄像机,当节点发生缩放,旋转和位置变化时,都需要覆盖摄像机,让这个节点通过摄像机进行重新渲染。
官方对于摄像机的描述是这样的:CCCamera应用于每个CCNode中。 在从不同视野观察时起作用,OpenGL中的gluLookAt函数用来定位摄像机。 假如这个物体通过绽放、旋转、或者平移,那么这些操作将修改摄像机。 注意:使用摄像机或者操作旋转、绽放、平移等属性,你只能选其中一个,假如你使用摄像机,世界坐标就会失去作用。 局限性: 几种节点,如CCParallaxNode,CCParticle使用世界节点坐标,并且他们并不能正常工作,假如你使用摄像机移动他们(或者他们的任何父类)。 在成批的结点上(即一个结点上包含多个节点)如CCSprite对象不会正常工作当他们都从属于一个CCSpriteBatchNode对象时。 推荐你只在创建3d特效时使用。对于2d特效来说,用CCFollow动作或者平移、绽放、旋转更好。
场景(CCScene)
在游戏里,场景就是关卡。关卡由人物角色和背景构成。在电影里,场景就是电影中的各种场面,各种场面主要由人物活动和背景等构成。而在Cocos2d-x 引擎中,场景存放的是需要渲染的布景,任务角色和菜单,它可以作为一个整体,一起渲染,一起销毁,一起被场景切换使用。
即游戏关卡的实施者,其管理这多个CCLayer,进行场景展现,相关业务逻辑的处理等;
布景(CCLayer)
从概念上说,布景就是场景里的背景。其实就是层次的概念,这种概念在KJava时代就已经存在,就是手动地把游戏中的场景分层(也有靠地图编辑器实现)。
每个游戏场景中都可以有很多层,每一层有各自的职责任务,例如专门负责显示背景,专门负责显示道具,专门负责显示任务角色等,在每一层上面可以放置不同的元素,包括文本,精灵和菜单等,通过层与层之间的组合关系,我们可以很容易的控制和显示各种各样的界面了,当然,其和photoshop中的层一样,也有透明之说,所以为了能够看到每一层上面的东西,很多层都设置为透明或半透明的,否则只能看到最上面的一层了。
一般一个场景可以有很多层,比如背景图层,物件层,NPC层,角色层,UI层等等,每个层负责自己的功能业务,总的在一个CCScene里共存,随着场景的隐藏而隐藏;不同的层之间可以通过设置不同alpha通道(透明度)进行显示控制;
角色(CCSprite)
精灵是整个游戏开发处理的主要对象,包括主角和敌人、NPC等,甚至随机飘过的一片云或飞鸟从技术上讲,也是精灵,因为精灵在cocos2d-x中,就是一个可以不断变化的图片,这些变化包括位置变化,旋转、放大缩小和运动等。
动作(CCAction)
角色所具有的动作,一般用于精灵发生动作时使用,如移动,释放魔法等。
总体来说以上的对象主要关联如下:
cocos2d-X学习之主要类介绍:CCDirector
在cocos2d-x里面,游戏的任何时间,只有一个场景对象实例处于运行状态,该对象可以作为当前游戏内容的整体包对象
Cocos2d-x引擎除了提供了CCDirector,还提供了一个CCDisplayLinkDirector,CCDisplayLinkDirector是一个可以自动刷新的CCDdirector。
CCDirector主要函数如下:
CCScene * getRunningScene (void) //获取当前运行的场景
double getAnimationInterval (void)//获取当前的FPS
virtual void setAnimationInterval (double dValue)=0 //设置FPS
bool isDisplayFPS (void) //是否在屏幕底部显示FPS
void setDisplayFPS (bool bDisplayFPS) //设置在屏幕底部显示FPS
CC_GLVIEW * getOpenGLView (void) //获取CCEGLView
void setOpenGLView (CC_GLVIEW *pobOpenGLView) //设置CCEGLView
bool isPaused (void) //当然是否适合暂停
unsigned int getFrames (void) //获取从director开始起,所有被调用的Frames的数量
ccDirectorProjection getProjection (void) //获取OpenGl的projection
void setProjection (ccDirectorProjection kProjection) //设置Opengl 的projection
bool isSendCleanupToScene (void) // 场景替换时,是否接收到cleanup时间,若新的的场景是被push进来的,旧的场景不会收到cleanup 事件,若新的场景是被替换进来的,旧的场景就能够收到cleanup事件。
CCSize getWinSize (void) //获取Open gl view的大小,单位为点
CCSize getWinSizeInPixels (void) // 获取以像素为单位的open gl view大小
CCSize getDisplaySizeInPixels (void) //获取以像素为单位的open gl view 的显示区域大小
void reshapeProjection (const CCSize &newWindowSize) //改变projection的大小
CCPoint convertToGL (const CCPoint &obPoint) //将UIKIT坐标体系转化为opengl坐标体系
CCPoint convertToUI (const CCPoint &obPoint)//将opengl坐标体系转化为UIKIT坐标体系
float getZEye (void) //获取缺省镜头Z的位置
void runWithScene (CCScene *pScene) //运行场景
void pushScene (CCScene *pScene) //push场景
void popScene (void)//pop场景
void replaceScene (CCScene *pScene) //替换场景
void pause (void) //暂停游戏
void resume (void) //回复游戏
virtual void stopAnimation (void)=0 //停止动画
virtual void startAnimation (void)=0 //开始动画
void drawScene (void) //每次frame都会被调用,无需自己调用
void purgeCachedData (void) //删除缓存的数据
void setGLDefaultValues (void) //设置Opengl的默认值
void setAlphaBlending (bool bOn) //设置是否启用opengl的alpha通道
void setDepthTest (bool bOn)//设置是否测试景深
virtual void mainLoop (void)=0//游戏主循环
void applyOrientation (void) //是设备方向设置生效
ccDeviceOrientation getDeviceOrientation (void) //获取设备方向
void setDeviceOrientation (ccDeviceOrientation kDeviceOrientation) //设置游戏横屏
bool enableRetinaDisplay (bool enabled) //设置是否启用视网膜屏支持
bool isRetinaDisplay ()//是否启用视网膜屏支持
void resetDirector () //重置游戏
static bool setDirectorType (ccDirectorType obDirectorType) //设置directortype,目前主要有kCCDirectorTypeNSTimer、kCCDirectorTypeMainLloop,kCCDirectorType-ThreadMainLoop、kCCDiretorTypeDisplayLknk
cocos2d-X学习之主要类介绍:摄像机(CCCamera)
在cocos2d-x中,每个节点(CCNode)都需要用到,即当节点发生旋转、缩放和位置变化等时,都需要覆盖CCCamera,然后这个节点通过CCCamera重新渲染。
类结构:
其主要函数如下:
char * description (void) //返回当前摄像机的描述
void restore (void) //重置摄像机,使摄像机回到默认位置
void locate (void) //按设置的eye坐标放置摄像机
void setEyeXYZ (float fEyeX, float fEyeY, float fEyeZ) //设置摄像机eye坐标
void setCenterXYZ (float fCenterX, float fCenterY, float fCenterZ)//设置center的坐标
void setUpXYZ (float fUpX, float fUpY, float fUpZ)//设置up的坐标
void getEyeXYZ (float *pEyeX, float *pEyeY, float *pEyeZ) //获取eye的坐标
void getCenterXYZ (float *pCenterX, float *pCenterY, float *pCenterZ)//获取center的坐标
void getUpXYZ (float *pUpX, float *pUpY, float *pUpZ)//获取Up的坐标
cocos2d-X学习之主要类介绍:场景(CCScene)
场景(CCScene)
类结构:
CCScene主要有以下两个函数:
bool init () //初始化函数
static CCScene * node (void) //生CCScene
作为场景类,为何只有这两个函数而没有其他方法呢,因为目前在CCScene承担的是一个容器的功能,游戏开发时需要渲染的对象反正CCScene里面统一管理,包括创建、销毁和场景切换等,而且从其类的结构图可看出,其直接继承了CCNode类,下章我们会具体介绍CCNode类
cocos2d-X学习之主要类介绍:节点CCNode
首先是类结构:
可以看到CCNode 几乎是游戏中处理的大部分类的父类,其主要有以下函数:
virtual int getZOrder (void) //获取节点的顺序
virtual const CCPoint & getPosition (void) //获取节点的位置
virtual void setPosition (const CCPoint &var) //设置节点的位置
virtual CCArray * getChildren (void) //获取其所有子节点
virtual CCCamera * getCamera (void)//获取其对应的摄像机
virtual bool getIsVisible (void) //判断节点是否可见
virtual void setIsVisible (bool var) //设置节点可见性
virtual const CCPoint & getAnchorPoint (void) //获取节点的锚点的位置
virtual void setAnchorPoint (const CCPoint &var) //设置节点的锚点位置
virtual bool getIsRunning (void) //判断节点是否在运行
virtual CCNode * getParent (void)//获取父及节点指针
virtual void setParent (CCNode *var) //设置节点的父节点
virtual int getTag (void) //获取节点的tag
virtual void setTag (int var) //设置节点的tag
char * description (void) //返回节点的描述
virtual void onEnter () //进入节点时的回调函数
virtual void onEnterTransitionDidFinish ()//进入节点后的回调函数
virtual void onExit ()//离开节点时的回调函数
virtual void addChild (CCNode *child)//增加节点
virtual void addChild (CCNode *child, int zOrder) //通过顺序添加节点
virtual void addChild (CCNode *child, int zOrder, int tag)//通过顺序和tag添加节点
void removeFromParentAndCleanup (bool cleanup)//删除父节点中的当前节点并清除动作及回调函数
virtual void removeChild (CCNode *child, bool cleanup) //删除节点
void removeChildByTag (int tag, bool cleanup)//通过tag删除节点
virtual void removeAllChildrenWithCleanup (bool cleanup)//删除节点并清除动作及回调函数
CCNode * getChildByTag (int tag)//通过tag获取节点
virtual void reorderChild (CCNode *child, int zOrder)//根据order重新排序
virtual void cleanup (void)//清除动作
virtual void draw (void)//绘制自己
virtual void visit (void)//访问节点
CCAction * runAction (CCAction *action) //运行动作
void stopAllActions (void)//停止所有的动作
void stopAction (CCAction *action)//停止动作
void stopActionByTag (int tag) //通过tag停止动作
CCAction * getActionByTag (int tag)//通过tag获取动作的指针
unsigned int numberOfRunningActions (void)//正在运行的动作的总数
void schedule (SEL_SCHEDULE selector)//定义一个定时器
void schedule (SEL_SCHEDULE selector, ccTime interval)//定义一个定时器
void unschedule (SEL_SCHEDULE selector)//取消一个定时器
void unscheduleAllSelectors (void)//取消所有定时器
void resumeSchedulerAndActions (void)//恢复定时器和动作
void pauseSchedulerAndActions (void)//暂停定时器和动作
static CCNode * node (void)//生成一个节点
CCNode是cocos2d-x的渲染链,写游戏基本上就是和他打交道了,cocos2d-x同时只能渲染一个CCScene,因此CCScene是渲染的根节点。在构建游戏时,一般是一个Scene中添加一个或者多个CCLayer,一个Layer中又添加多个CCSprite或者CCMenu,CCSprite中还可以添加CCParticleSystem等等。这样就构建了一个渲染树,cocos2d-x历遍这个树来将图像显示在屏幕上。
coco2d-x的渲染实际上是调用visit()函数来完成的:即visit()这个函数调用它包含的Child的zOrder<0的visit()函数,之后调用draw()函数,再调用Child的zOrder>=0的visit()函数,它实际上是一个深度优先的算法。他的Child是按照zOrder排序的,以保证渲染的正确性。draw()的作用是绘制自己。在CCSprite这些确实需要绘制的类中,draw()调用openGL的函数来完成绘制功能——把一个纹理映射到一个矩形上。
如果要自定义绘制一些图像,可以重写draw()函数,不过不要忘记调用父类的draw()函数。
可以进行网状关系的管理,其实CCScene,CCLayer也是一个CCNode.它提供节点增删,包含,提供节点缩放,每个节点有一个照相机,提供动画支持,也就是说每一个从CCNode派生的类都可以执行动画操作;
cocos2d-X学习之主要类介绍:布景:CCLayer
类继承图:
CCLayer 是CCNode的子类 ,实现了TouchEventsDelegate接口,继承了CCNode所有的特性,并且附加了一些自己的特性,它能够接收iPhone的触摸事件,也能够接收Accelerometer的输入。
其主要函数如下:
bool init () //初始化函数
virtual void onEnter ()//进入时的回调函数
virtual void onExit ()//离开时的回调函数
virtual void onEnterTransitionDidFinish ()//进入后的回调函数
virtual bool ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent)//单点触屏事件
virtual void ccTouchesBegan (CCSet *pTouches, CCEvent *pEvent)//多点触屏事件
virtual void ccTouchesMoved (CCSet *pTouches, CCEvent *pEvent)//在触摸屏幕移动事件
virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent)//触摸屏幕移动时间结束
virtual void ccTouchesCancelled (CCSet *pTouches, CCEvent *pEvent)//触屏事件取消
static CCLayer * node (void)//生成layer
cocos2d-X学习之主要类介绍:精灵角色(CCSprite)
CCSprite是一副2D图像,CCSprite可以通过图像或者图像中的一个矩形子区域创建 如果它的父节点或者任意继承树上的节点是CCspriteBatchNode则具有下述特性:
父节点是CCSpriteBatchNode时具有的特性: 更快的渲染速度,特别时CCSpriteBatchNode有很多子节点的情况下,但有以下限制:
A、不支持照相功能(例如:CCOrbitCamera动作不能执行)
B、不支持基于网格的动作(例如:CCLens,CCRipple,CCTwirl)
C、Alias / Antialias属性属于CCSpriteBatchNode,所以你不能单独设置aliase属性
D、渲染函数属性属于CCSpriteBatchNode,所以你不能单独设置渲染函数属性
E、不支持视差滚动,但是可以通过“代理”精灵模拟 如果它的父节点时普通CCNode,那么CCSprite具有和其它任何CCNode一样的行为。
虽然有以上限制,但它也有以下优点:
A、支持渲染(Blending)功能
B、支持Alias / Antialias • 但是渲染速度会比较慢,每次只渲染一个子节点 CCSprite默认的锚点时(0.5, 0.5)
可以说,所有与图片有关系的,都可以用这个来处理,主要是提供图片的加载展示,可以加载序列帧,以便动画播放
类继承图
其主要函数除了CCNode继承下来的函数外,还有以下函数:
virtual void setTexture (CCTexture2D *texture)//设置精灵的纹理
virtual CCTexture2D * getTexture (void)//获取精灵的纹理
bool initWithTexture (CCTexture2D *pTexture)//根据纹理初始化精灵
bool initWithTexture (CCTexture2D *pTexture, const CCRect &rect)//根据纹理指定的区域初始化精灵
bool initWithSpriteFrame (CCSpriteFrame *pSpriteFrame)//根据SpriteFrame初始化精灵
bool initWithSpriteFrameName (const char *pszSpriteFrameName)//根据spriteFrame的名称初始化精灵
bool initWithFile (const char *pszFilename)//根据plist文件初始化精灵
bool initWithFile (const char *pszFilename, const CCRect &rect)//根据plist文件初始化精灵
bool initWithBatchNode (CCSpriteBatchNode *batchNode, const CCRect &rect)//批量根据节点初始化精灵
void setDisplayFrameWithAnimationName (const char *animationName, int frameIndex)
static CCSprite * spriteWithTexture (CCTexture2D *pTexture) //根据纹理生成精灵
static CCSprite * spriteWithTexture (CCTexture2D *pTexture, const CCRect &rect)//根据纹理指定的区域生成精灵
static CCSprite * spriteWithTexture (CCTexture2D *pTexture, const CCRect &rect, const CCPoint&offset)//根据纹理指定的区域和点偏移生成精灵
static CCSprite * spriteWithSpriteFrame (CCSpriteFrame *pSpriteFrame)//根据SpriteFrame生成精灵
static CCSprite * spriteWithSpriteFrameName (const char *pszSpriteFrameName)//根据SpriteFrame的名称生成精灵
static CCSprite * spriteWithFile (const char *pszFileName)//根据plist文件按生成CCSprite
static CCSprite * spriteWithFile (const char *pszFileName, const CCRect &rect)//根据plist文件生成精灵
static CCSprite * spriteWithBatchNode (CCSpriteBatchNode *batchNode, const CCRect &rect)//根据节点批量生成精灵
cocos2d-X学习之主要类介绍:动作:CCAction
类继承图:
主要函数:
virtual CCObject * copyWithZone (CCZone *pZone)//克隆对象
virtual bool isDone (void)//动作是否已经换成
virtual void startWithTarget (CCNode *pTarget)//设置动作关联的对象,动作运行前调用该方法
virtual void stop (void)//停止动作
virtual void step (ccTime dt)//设置动作的间隔时间
CCNode * getTarget (void)//获取动作关联的对象
void setTarget (CCNode *pTarget)//设置动作的关联的对象
int getTag (void)//获取动作的tag
void setTag (int nTag)//设置动作的tag
static CCAction * action ()//生成action