Cocos2d-x 学习之引擎介绍

时间:2022-09-17 04:57:46

Cocos2d-x 学习之引擎介绍

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库)

基础物理引擎Box2dchipmunk

根据不同屏幕分辨率自动缩放适配

Lua脚本支持。

关于cocos2d-x中的“X”“X”有两意思,一个是表示“C++”,因为有时候,C++文件的后缀名可以用cxx代替,因此X便表示该开源项目使用C++编写,并且提供C++API,二是表示“Cross”,该开源项目的目标是跨更多平台。

·什么是“X”cocos2d-X方式:有时候,我们写的cpp文件扩展CXX“X”,标志着该项目是由C + +中,并提供C + +中的API编写的。 ◦“X”,也意味着交叉。这个开源项目的目标是让用户创建跨平台的代码。目前支持的平台是在iPhoneAndroid的,WoPhoneWin32平台上,但可根据要求提供更多的平台。

Cocos2d-x其他版本介绍

Cocos2d:是所有cocos2d引擎的家族的鼻祖,最早是有阿根廷一个叫Rcardo Quesada的人用Python脚本写的,其主要用来开发2d游戏和基于2d图形的任何应用,第一次发布是2008229日,官方网站是http://www.cocos2d.org

Cocos2d-iphone:是基于cocos2d的思想开发的,第一版在2008625号发布,其基本是与苹果ios一起成长起来的,凭借着使用object-c语言和SDK的无缝衔接的优势,获得了广大果粉开发者的追捧和喜爱,现在已成为苹果ios2d游戏引擎的首选。官方网站是http://www.cocos2d-iphone.org

Cocos2d-x for xna 2012217日,著名的开源社区Cocos2d发布Cocos2d-X for XNA版本。该游戏引擎针对微软最新移动操作系统Windows Phone 7平台,开发者可以采用C#语言开发基于Windows Phone平台的游戏,而无需学习XNA绘图接口。据悉,该游戏引擎由Cocos2d-X团队和OpenXLive合作开发。OpenXLiveWindows Phone上最早的游戏社交平台。其下载地址:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download

Cocos2d-windows:cocos2dwindows实现,使用GPL V3协议发布,该分支是由一位韩国人所在,但和大多数开源项目一样,在一次较大范围的提交之后就无小心了,没有留下文档,也没有更新,官方网站是:http://code.google.com/p/cocos2d-windows

Cocos3d:cocos2d3D实现,由加拿大人Bill Holling开发和维护,cocos3d不是一个完全的3d引擎,而是在cocos2dCCLayer层上面扩展出3d世界,以cocos2d-ihpone扩展包的形式运行,官方网站是:http://www.cocos3d.org

Cocos2d-andoid:是cocos2djava实现,并且能够在Android上运行,使用BSD协议发布,官方网站是http://code.google.com/p/cocos2d-android

Cocos2d-javscript:cocos2djavascript实现,由一个新西兰程序员建立和维护,其把cocos2d整套框架一到了Html5javascript上面了,官方网站是:http://cocos2d-javascript.org

不过目前在cocos2d-x官方上已经有cocos2d-html5发布了。

ShinyCocos:把cocos2d-iphone绑了ruby实现,官方网站:http://github.com/funkaster/shinycocos

 

 

 

Cocos2d-x学习之 整体框架描述

1Cocos2d-x 整体描述

和传统的游戏引擎一样,cocos2d-x作为一个2d的游戏引擎,其也有以下几大概念组成:

导演(CCDiretor:

cocos2d-x引擎中,CCDirector类是整个游戏的组织和控制核心,游戏的运行规则,游戏内的CCScene(场景)、布景(CCLayer)、角色(CCSprite)等的运动,均由CCDirector管理,其在游戏中起着指定游戏规则让游戏内的场景、布景和任务有序的运行。在整个游戏里面,一般只有一个导演,游戏开始和结束时,都需要调用CCDirector的方法完成游戏初始化或销毁工作,其提供了一些场景管理的方法,如runWithSceneDrawScenepushScenereplaceScen等。

它控制FPS的显示隐藏,窗口大小,游戏的进入,退出,关卡的切换,取得正交模式,取得正在运行的场景,取得GL视图,游戏主循环入口等等

摄像机(CCCamera  
    游戏中每个节点都需要摄像机,当节点发生缩放,旋转和位置变化时,都需要覆盖摄像机,让这个节点通过摄像机进行重新渲染。

官方对于摄像机的描述是这样的:CCCamera应用于每个CCNode中。 在从不同视野观察时起作用,OpenGL中的gluLookAt函数用来定位摄像机。 假如这个物体通过绽放、旋转、或者平移,那么这些操作将修改摄像机。 注意:使用摄像机或者操作旋转、绽放、平移等属性,你只能选其中一个,假如你使用摄像机,世界坐标就会失去作用。 局限性: 几种节点,如CCParallaxNodeCCParticle使用世界节点坐标,并且他们并不能正常工作,假如你使用摄像机移动他们(或者他们的任何父类)。 在成批的结点上(即一个结点上包含多个节点)如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,还提供了一个CCDisplayLinkDirectorCCDisplayLinkDirector是一个可以自动刷新的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) //获取OpenGlprojection

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) //设置是否启用openglalpha通道

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,目前主要有kCCDirectorTypeNSTimerkCCDirectorTypeMainLloop,kCCDirectorType-ThreadMainLoopkCCDiretorTypeDisplayLknk

 

 

 

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)//生成一个节点

CCNodecocos2d-x的渲染链,写游戏基本上就是和他打交道了,cocos2d-x同时只能渲染一个CCScene,因此CCScene是渲染的根节点。在构建游戏时,一般是一个Scene中添加一个或者多个CCLayer,一个Layer中又添加多个CCSprite或者CCMenuCCSprite中还可以添加CCParticleSystem等等。这样就构建了一个渲染树,cocos2d-x历遍这个树来将图像显示在屏幕上。

coco2d-x的渲染实际上是调用visit()函数来完成的:即visit()这个函数调用它包含的ChildzOrder<0visit()函数,之后调用draw()函数,再调用ChildzOrder>=0visit()函数,它实际上是一个深度优先的算法。他的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、不支持基于网格的动作(例如:CCLensCCRippleCCTwirl

CAlias / 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