学cocos code idebuilder要多久

3769人阅读
本实例基于 CocosBuilder 2.1 以及&cocos2d-2.0-x-2.0.4,因为cocosbuilder3.0+的版目前还不是很稳定!如果不是要做html5的项目,还是建议使用2.1的版本为佳。
虽然网上已经有很多cocosBuilder的教程,但大多数都是基于cocos2d里的test实例来讲的,每当我照着他们的做法去学习时总是会碰到很多问题,所以决定写下我学习的经历,以及会碰到什么样的错误!希望碰到跟一样问题的同学可以不用走太多的弯路!
一开始我是使用的是最新版的CocosBuilder-3.0-alpha2 和&cocos2d-2.1beta3-x-2.1.0,官方说这两版本是兼容的!在cocos2d是里test项目里也确实是没问题可以运行的!但每当我自己在cocosBuilder里自己新建一个Layer,并保存和publish后,在cocos2d里加载总是会报一些错误!实在是不想去找那些bug,跟何况自己对cocosBuilder还不了解,太过于转牛角尖只会浪费时间,搞不好还会打击自己的自信心,所以还是建议初学者使用比较稳定的版本!
-----------------------------------------------------------------------------------------------------------------------------------------
那么现在开始我们的第一篇!&加载一个Layer并连接到类
新建一个project,并保存到指定文件夹!完成后你会看到一个HelloCocosBuilder.ccb文件,我们不管他(如果你想删除它,可以在文件夹里直接删除即可)
然后逐一加入我们需要的背景等等,完成后如下图,我们选择timeline上最上的CCLayer,并在Custom class选项里填入自己类名(这里我把它叫做MenuLayer)
然后保存,因为cocos2d加载是读取的是.ccbi文件,我们现在为止完成的是.ccb文件,所以我们还需把它publish,并把它加入到我们的项目里的resources file里去,或者加到Build Phases里去。
这样我,我们就准备好.ccbi文件了。
记住每当我们在builder 里做了修改后,一定要保存,然后再publish,这样才能确保我们的.ccbi文件是最新的!我就在这个环节上吃了几次亏,明明已经改了某些连接名,但加载的时候还是提示找不到对应的连接名。
接下来是代表部分。
MenuLayer.h文件
#ifndef __bug__Menue__
#define __bug__Menue__
#include &iostream&
#include &cocos2d.h&
#include &cocos-ext.h&
class MenuLayer
: public cocos2d::CCLayer
, public cocos2d::extension::CCBSelectorResolver //解析选择器接口
, public cocos2d::extension::CCBMemberVariableAssigner //分配成员变量接口
, public cocos2d::extension::CCNodeLoaderListener //监听加载节点接口
CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MenuLayer, create);
static cocos2d::CCScene * scene();
MenuLayer();
virtual ~MenuLayer();
virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader); //实现CCNodeLoaderListener接口,当每个节点被加载时调用。
virtual bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode); //实现CCBMemberVariableAssigner接口, 连接变量
virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName); //实现CCBSelectorResolver接口, 用于连接菜单项。
virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName); //实现CCBSelectorResolver接口, 用于连接CCControl。
void startBtnClick(cocos2d::CCObject * object);
virtual void ccTouchesBegan(cocos2d::CCSet * pTouch, cocos2d::CCEvent * pEvent);
virtual bool ccTouchBegan(cocos2d::CCTouch * pTouch, cocos2d::CCEvent * pEvent);
virtual void update(float deita);
cocos2d::CCMenuItemImage * startB
cocos2d::CCLabelTTF * labelT
#endif /* defined(__bug__Menue__) */将我们刚刚做好的menu.ccbi连接到类MenuLayer类
Menu.cpp文件
#include &MenuLayer.h&
#include &MenuLayerLoader.h&
#include &GameMainSceneScene.h&
USING_NS_CC;
USING_NS_CC_EXT;
MenuLayer::MenuLayer(): startBtn(NULL), labelTxt(NULL){
MenuLayer::~MenuLayer(){}
CCScene * MenuLayer::scene(){
CCScene * scene = CCScene::create();
CCLayer * layer = MenuLayer::create();
scene-&addChild(layer);
void MenuLayer::onNodeLoaded(CCNode *pNode, CCNodeLoader *pNodeLoader){
labelTxt-&setString(&hah, you will start game!&);
labelTxt-&setPositionY(100);
this-&scheduleUpdate();
startBtn-&setPositionY(100);
this-&setTouchEnabled(true); //设为支持触摸
this-&setTouchMode(cocos2d::kCCTouchesAllAtOnce);//设置是否支持多点触摸
void MenuLayer::update(float deita){
bool MenuLayer::onAssignCCBMemberVariable(CCObject *pTarget, CCString *pMemberVariableName, CCNode *pNode){
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, &startBtn&, CCMenuItemImage *, this-&startBtn); //连接startBtn按钮
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, &labelTxt&, CCLabelTTF *, this-&labelTxt); // 连接CCLabel
SEL_MenuHandler MenuLayer::onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName){
CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, &startBtnClick&, MenuLayer::startBtnClick); //连接菜单选择器
return NULL;
void MenuLayer::startBtnClick(CCObject * object){
CCScene * ccScene = GameMainSceneScene::create();
CCDirector::sharedDirector()-&replaceScene(ccScene);
SEL_CCControlHandler MenuLayer::onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName){
return NULL;
void MenuLayer::ccTouchesBegan(cocos2d::CCSet *pTouch, cocos2d::CCEvent *pEvent){
bool MenuLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
因为我们加载的是一个Layer,所以我们的loader 类要继承CCLayerLoader类
MenuLayerLoader.h 文件
#ifndef __bug__MenuLayerLoader__
#define __bug__MenuLayerLoader__
#include &iostream&
#include &MenuLayer.h&
class CCBR
class MenuLayerLoader : public cocos2d::extension::CCLayerLoader{
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MenuLayerLoader, loader); //使用loader创建MenuLayerLoader类。
protected:
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MenuLayer); //调用create方法创建MenuLayer。
#endif /* defined(__bug__MenuLayerLoader__) */
使用MenuSceen加载MenuLayer类
MenuScene.cpp
#include &MenuScene.h&
MenuScene::MenuScene(){
bool MenuScene::init(){
cocos2d::extension::CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary-&registerCCNodeLoader(&MenuLayer&, MenuLayerLoader::loader());
/* Create an autorelease CCBReader. */
cocos2d::extension::CCBReader * ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);
/* Read a ccbi file. */
CCNode * node = ccbReader-&readNodeGraphFromFile(&menus.ccbi&, this);
ccbReader-&release();
if(node != NULL) {
this-&addChild(node);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48032次
排名:千里之外
原创:23篇
转载:22篇
评论:12条
(1)(2)(2)(2)(1)(1)(3)(3)(1)(6)(2)(2)(3)(1)(16)(3)该系列其他文章
CocosBuilder生成cbbi文件,绑定到Cocos2d-x
今天弄了一天,记录一下。
首先是版本。我用的cocosBuilder 3 和 cocos2d-x 2.1.2。亲测cocosBuilder 2和最新版本的cocos2d-x不兼容。
报错为WARNING! Incompatible ccbi file version (file: 3 reader: 5)。升级到cocosBuilder 3,XCode与VS2012测试没问题。
这套体系的原理是:首先用cocosBuilder编辑成它的文件XXX.ccb。然后要发布版文件为ccbi。
在cocos2d体系中有CCBReader库,可以将ccbi文件中的信息解读成cocos2d-x可理解的格式。
但是事情远没有想象的那么美好,就如鲜花总会插在牛粪上一样。ccbi文件读取到程序中的过程真是令人恶心。
不抱怨,说正题:
首先,要自己写个CCLayer的子类,还要分别继承CCBSelectorResolver和CCBMemberVariableAssigner。
并实现这两个虚基类的接口。同时,还要写个CREATE_FUNC方法,在下一步中会用到。例如:
class MyLayer:public CCLayer,public CCBSelectorResolver,public CCBMemberVariableAssigner{
CREATE_FUNC(MyLayer);
void enterPlay(CCObject *pSender);
void pressTitle(CCObject *pSender, CCControlEvent pCCControlEvent);
//CCBSelectorResolver
virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName) ;
virtual SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName) ;
//CCBMemberVariableAssigner
virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);
然后对应每一个Layer还要写一个Loder。Loader继承自CCLayerLoader。其需要做两件事。1、创建一个loader方法。2、将Loader与相应的Layer关联。例如:
class MyLayerLoder :public CCLayerLoader{
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MyLayer, loader);
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MyLayer);
好了,现在完成了定义。接下来是实现。
在相应的注册函数中注册关联。使用CCB_SELECTORRESOLVER_CCMENUITEM_GLUE、&CCB_SELECTORRESOLVER_CCCONTROL_GLUE、&CCB_MEMBERVARIABLEASSIGNER_GLUE宏完成相应的注册。例如:
SEL_MenuHandler MyLayer::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName)
CCB_SELECTORRESOLVER_CCMENUITEM_GLUE( this, "pressPlay", MyLayer::enterPlay);
return NULL;
//函数定义类型为:void pressTitle(CCObject *pSender);
SEL_CCControlHandler MyLayer::onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName)
CCB_SELECTORRESOLVER_CCCONTROL_GLUE( this, "pressTitle", MyLayer::controlButtonTest);
return NULL;
bool MyLayer::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode)
CCB_MEMBERVARIABLEASSIGNER_GLUE( this, "helloLabel", CCLabelTTF*, helloLabel);
最后是载入调用。首先将相应的Layer与Loader注册到CCNodeLoaderLibrary中。然后用CCBReader读出来。最后调用reader的相应方法将资源解析出来。例如
CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary()-&registerCCNodeLoader( "MyLayer", MyLayerLoder::loader());
CCBReader* reader = new CCBReader( CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary() );
reader-&autorelease();
pDirector-&runWithScene(reader-&createSceneWithNodeGraphFromFile("MyLayer"));
就是这样了,问题在于每个都要写,一写还是两个(layer与Loader)。看着这代码真不爽。晚上回家想想有没有什么好办法改善一下。
对于上面这堆代码,Good Luck For You。
本篇博客出自,转载请注明出处:
来源网址:
评论内容不能为空。2392人阅读
下载准备工具
1.http://www.cocos2d-iphone.org/download下载cocos2d-iphone-2.1-rc0.tar.gz
已经安装之前版本的同学只要到控制台的文件目录下输入&./install-templates.sh&-f就可以覆盖安装
cocosbuilder
2./?page_id=11下载cocosbuilder&2.1版本
3.cocos2d项目文件后,打开cocosbuilder
File-&New-&NewProject,Save&As命名cocosbuilder工程名,
之后选的路径请选择cocos2d工程下的Resources文件夹下点击Save保存
4.File-&New-&NewFile,建立新的CocosBuilder文件,起个名字Save保存到CocosBuilder工程目录下
5.按照各种教程做好简单的动画后,选择Files-&Publish,这时候目录下会生成一个.ccbi的文件。
6.打开cocos2d项目,添加上生成的资源文件后,在AppDelegate中导入
#import&&CCBReader.h&文件剩下只需要将[director&runWithScene:&[IntroLayer&scene]];这句话
替换成CCScene*&mainScene&=&[CCBReader&sceneWithNodeGraphFromFile:@&生成的文件.ccbi&];
&&&&&&&&&&[director_&pushScene:&mainScene];
7.启动模拟器,现在你应该可以看到效果了。当然你可能会碰到如下问题
&&&&&(1)导入图是否高清图,显示不正常
&&&&&(2)横竖显示是否正常
&&&&&(3)cocosbuilder和cocos2d之间如何交互(提示下cocosbuilder中选中按钮控件属性中会有select填上对应的方法名即可。当然此方法需要在跟ccbi文件同名的类文件中)
这些问题百度下都能找到。。。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36724次
排名:千里之外
原创:21篇
(1)(1)(1)(1)(2)(3)(1)(12)(1)(1)(1)下次自动登录
现在的位置:
& 综合 & 正文
Cocos2D开发之(6) 使用CocosBuilder
在使用CocosBuilder的过程中遇到好多奇奇怪怪的问题,好在都一一解决了,下面这篇博文就来总结介绍一下如何使用CocosBuilder这个强大的辅助开发工具。其实学习CocosBuilder如何使用,十分建议要看开发文档。
这里我使用的CocosBuilder是最先的3.0-alpha5版本,cocos2d-iPhone是2.1版本。
下面以我学习的过程中遇到的问题来开始讲述:
问题一:使用CocosBuilder生成的ccbi文件要用到CCBReader库。那么我的第一个bug出现了,由于之前我使用的是CocosBuilder2.1版本,所以生成的ccbi文件就和CCBReader库的版本不匹配,导致无法CCBReader无法读取ccbi文件。这个问题我的这篇博文有说明
问题二:将ccbi文件和所需要的资源导入xcode 的项目中时,出现无法读取资源的问题。这个时候我就瞎折腾了一番还是得不到解决,终于在看来CocosBuilder的文档后,问题解决了。
下面重点介绍如何在CocosBuilder中Setting up a New Project ,其中需要的一些配置,然后导入xcode 项目中使用。
下面引用文档中的内容为线索进行介绍:
Creating a Project for cocos2d-iphone
It's best to setup your Xcode project before creating your CocosBuilder project. Make sure that the cocos2d templates are installed and create a new
cocos2d-iphone project in Xcode (if you do not already have a project you want to use with CocosBuilder).
Once you have the Xcode project set up, create your CocosBuilder project. Select New Project… from theFile menu.
Save the CocosBuilder project in the Xcode project's Resources directory.
Step-1:文档中建议最好是在创建CocosBuilder项目之前就创建好Xcode项目,然后创建CocosBuilder项目的时候,保存到Xcode项目的资源文件目录下(有一个好处就是方便查找Xcode项目文件和CocosBuilder项目文件),当然呢,也可以不这么做,个人习惯。
All images and sprite sheets you put in the Resources directory will now show up automatically in CocosBuilder's project view on
the left side of the main window, but remember that you will need to add them to your Xcode project if you want to use them in the compiled version of your app.
Step-2:创建好CocosBuilder项目后,把需要的资源(图片,字体等)放到CocosBuilder的资源文件中,在CocosBuilder的编辑视图的左边就会显示你添加的资源,注意:你创建新的Interface File(新的scene)的时候,保存路径默认也是要这个资源文件,当然你也可以不这样做,下面会讲到。
Now update the settings of your project. Choose Project Settings…, in the settings window deselect the JavaScript based project checkbox. Save
your changes and open the Publish Settings…. Set the iOS export path to your Resources directory, check the Flatten paths when publishing checkbox and check the Only publish ccb-files checkbox.
Make sure that the iOS export target is selected, but the Android and HTML5 ones are unchecked.
Step-3:下面重点讲一下Project Setting和Publish Setting。
(1)Project Setting
①:其中的Resource paths 表示的是资源(图片,字体等)的路径,默认情况下就是CocosBuilder项目中的Resources文件了,那么你创建新的Interface File的时候保存路径就是这个了,但是这里我又添加了一个资源路径(点击+或-),那么创建新的Interface File的时候就可以保存到这个新的资源路径下了。
②:注意不要勾选
JavaScript based project
(2)Publish Setting
①:publish对象只需要iOS就可以了,这里也可以选择publish文件的保存路径(最好就是保存到xcode项目里面去,这样就方便)。
②:下面重点要勾选 Flatten paths when publishing,要不然在Xcode中的项目在读取ccbi文件的时候会找不到资源文件。文档中有一段解释(大家自己看吧,我是没怎么看懂,大概说的是优化路径的意思):
接着呢就是下面两个选项:
首先看看第二个 Only publish cab-files,如果勾选了这个呢,它就只publish ccb文件,在cocosbuilder项目文件的Published-iOS文件中就只有.plist 和 .ccbi;如果不勾选呢,就会同时也会publish资源文件。那么有什么不同吗?不同就是我们将Published-iOS文件夹导入xcode的时候,如果没有勾选的话,由于文件夹中没有资源文件,就要再添加一次资源。
接着看 Publish to zip file
Publish to zip-file
以下是文档中介绍的实现步骤。但是我在这个版本3.0-alpha5中publish,cocosbuilder直接奔溃退出,估计是其本身的问题,所以也就没有接着尝试了,如果有知道的,麻烦告知一下。
You have the option to publish to a zip file. If this option is used a zip file called ccb.zip will be placed in your destination directory. To be able to load the zip-file in your code you need to:
Include the SSZipArchive classes, in addition to the CCBReader, in your Xcode project.
In your project's build settings, add CCBENABLEUNZIP to your Preprocessor Macros.
Replace cocos2d's default CCFileUtils class by calling [CCBFileUtils sharedFileUtils] before your cocos2d is loaded (you will need to import CCBReader.h to do this).
Unpack the zip file by calling [CCBReader unzipResources:@"ccb.zip"]
大致通过这些就可以将cocosbuilder中生成的ccbi文件应用到xcode项目中了,通过这篇博文实践就可以具体说明这个过程。这个是英文版的教程
下面大致讲一下我实现过程中的一些需要注意的地方:
(1)首先是关于ccbi文件如何在xcode项目中应用,我的做法是:首先创建xcode项目,然后创建cocosbuilder项目,当在cocosbuilder中组织好一个场景的ccb后就publish,这个时候publish的路径选择默认的Publishan-iOS,然后就把这个文件添加到xcode中(我publish的时候只是publish了ccb,资源的话我是单独添加到xcode中的);第二次publish的时候就要修改publish的路径为xcode中Publishan-iOS文件了,这样的话publish出来的ccbi文件就到了xcode中的(但是还没有添加到项目中),然后再在xcode中添加ccbi文件到项目中就ok了,这样会方便一些的。
在 CocosBuilder 的 Code
Connections section中的第二栏中有三个类型选项: Don't
Assign, Doc
root var and Owner
下面简单的介绍一下这三个选项是神马意思(在stackoverflow中有这样一个解释
Don't assign simply means that you are not using the Code
Connections.
这个是默认的选项,就是不分配类型,也就是不把这个节点与中的变量相关联。
Doc root var means that you are connecting a custom class cocos2d class. This will glue/connect the object in your document (CCB
stage/file) to your code. This option is convenient but you must make ensure that root node's controller object is provided.
我的理解是这个是根节点的意思,也就是连接到当前节点层级中最上层的,从属于根节点的类型。
Owner var provides
you with more flexibility by
allowing you to connect to a variable other then the root node. You can glue it to any variable of your choosing.
这个我的理解是,连接到指定的节点,从属于指定节点的类型。
error you are getting is most likely caused by providing a name that is not available (the variable doesn't exist). Note that setting the property to Doc
root var or Owner
var and leaving the field empty will cause this error.
在使用后面两个类型时,需要写好在类中定义的变量,否则会出现error的。还有一半情况下选择Doc
root var就ok了
最后上传了我的项目工程,有需要的就下载吧!
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 cocos 的文章

 

随机推荐