代码改变世界

Cocos2D-X中针对CocosBuilder的解析器CCBReader

2014-04-08 09:54  张智清  阅读(6244)  评论(0编辑  收藏  举报

之前的一博客空间到期没有备份,丢失了一些资料。以下仅仅通过搜素引擎找回的一些东东!

首先知道Cocos2D项目:

        在Cocos2D项目中加载ccb文件:在加载CocosBuilder的文件 前,CocosBuilder文档或者ccb文件需要以一种压缩的二进制各式发布——即ccbi文件。一旦被发布为ccbi文件,则只需要一行代码即可简 单地加载到具体的Cocos2D工程项目中(前提保证已经CCBReader.hCCBReader.m文件添加到项目中):

CCBReader *ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);
CCNode *myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi");

Cocos2D-X项目中又是如何加载ccb文件?

Cocos2D-X中针对CocosBuilder的解析器CCBReader(位于extensions/CCBReader目录下,且与CocosBuilder的版本有关系:CocosBuilder v2.1版本发布的文件,对于Cocos2D-X v2.1.1及低版本都不支持。因此无须再添加CCBReader.h和CCBReader.m这两个iOS特有的文件。),由于C++没有像Objective-C的动态特性,所以集成CCBReader的代码并没有如Cocos2D中的简单。

CCBReader的原理
ccbi文件其实对应了4类Cocos2D-X对象,一个ccbi文件,包含了此对象的一些属性信息。CCBReader读取了这个 ccbi文件,就清楚了这个对象的一切。这个时候,要把这些信息和我们的代码联系起来,就需要用到CCNodeLoaderLibrary来联系咱自定义 的类,接着把这个信息抛给CCBReader,由其进行关联。具体代码如下:

CCNodeLoaderLibrary  *ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader("Intro", IntroLoader::loader());

/* Create an autorelease CCBReader */
cocos2d::extension::CCBReader  *ccbReader = new  cocos2d::extension::CCBReader(ccNodeLoaderLibrary);

/* Read a ccbi file. */
CCNode  *node = ccbReader->readNodeGraphFromFile("MainScene.ccbi");
ccbReader->release();

CCScene  *scene = CCScene::create();
scene->addChild(node);

默认情况下,ccbi对应了Cocos2D-X的4个类型之一,如果要对应咱自定义的类型(从那4个类型中派生出来的),我们要在CocosBuilder中的根对象命名,如下图:

1364984313_1611选择CCLayer,在右侧的Custom class中填写Intro。(如果是Custom class显示为JS Controller,点击菜单Document/JavaScript Controlled,去掉其选项)。这个就可以理解上面的代码了:
CCNodeLoaderLibrary  *ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader(“Intro”, IntroLoader::loader());

上述例子中,IntroLoader对象就负责加载相关的类Intro。

可知:CCBReader进行ccbi和自定义类的关联的过程如下,CCBReader一边解析ccbi文件,一边调用自定义类的onResolveCCBCCMenuItemSelector等方法;在这些回调方法中,可以进行相关的绑定工作,如对象绑定、CCMenuItem  selector的绑定等。更多绑定细则,可以查看CocosBuilder中的帮助。

就是说,如果用Objective-C就比较方便,由于其动态性,可以根据名称自动反射;而C++则需要手动绑定,繁琐些,不过为了CocosBuilder带来方便,这个也是值得的。