那些大神的文章的确。。。设置custom class为XJLayer,这个很重要,还好看了你的文章,谢谢。补充:
修改custom class的步骤: 打开cocosBuilder-Document 把那个 JavaScript Controlled去掉。 选择根节点就可看到属性栏的custom class。
这两天在学习CocosBuilder,具体作用就不详细叙述了!
下载完以后,直接打开
好了,一个可视化的编辑界面出现了,像不像ps或者falsh?
点击File->New Project, 新建项目,项目随便保存在哪里!
新项目界面如下:
界面很cool吧,CocosBuilder自动为你创建了一个界面,是不是很期待把这个界面放到模拟器中运行呢?
好吧,接下来就是打开Xcode,新建一个cocos2dx项目,我的项目名为cocoBuilder!
项目路径须在cocos2d-x的安装目录下,方可运行!(我这里是这样).
好吧,下面来看一下我的cocoBuilder的文件结构
看看Classes文件夹,好像比你们多几个文件,重点的代码部分就在这几个文件中咯!
AppMacros.h
01 | #ifndef cocoBuilder_AppMacros_h |
02 | #define cocoBuilder_AppMacros_h |
03 |
04 | #include "cocos2d.h" |
05 |
06 | #define DESIGN_RESOLUTION_480X320 0 |
07 | #define DESIGN_RESOLUTION_1024X768 1 |
08 | #define DESIGN_RESOLUTION_2048X1536 2 |
09 |
10 | /* If you want to switch design resolution, change next line */ |
11 | #define TARGET_DESIGN_RESOLUTION_SIZE DESIGN_RESOLUTION_480X320 |
12 |
13 | typedef struct tagResource |
14 | { |
15 | cocos2d::CCSize size; |
16 | char directory[100]; |
17 | }Resource; |
18 |
19 | static Resource smallResource = { cocos2d::CCSizeMake(480, 320), "resources-iphone" }; |
20 | static Resource mediumResource = { cocos2d::CCSizeMake(1024, 768), "resources-ipad" }; |
21 | static Resource largeResource = { cocos2d::CCSizeMake(2048, 1536), "resources-ipadhd" }; |
22 |
23 | #if (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X320) |
24 | static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(480, 320); |
25 | #elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_1024X768) |
26 | static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(1024, 768); |
27 | #elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_2048X1536) |
28 | static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(2048, 1536); |
29 | #else |
30 | #error unknown target design resolution! |
31 | #endif |
32 |
33 | // The font size 24 is designed for small resolution, so we should change it to fit for current design resolution |
34 | #define TITLE_FONT_SIZE (cocos2d::CCEGLView::sharedOpenGLView()->getDesignResolutionSize().width / smallResource.size.width * 24) |
35 |
36 | #endif |
这个AppMacros.h文件的具体功能?额,我也没去研究过,谁研究清楚了,可以告诉我!
MainScene.h
01 | #ifndef __cocoBuilder__MainScene__ |
02 | #define __cocoBuilder__MainScene__ |
03 |
04 | #include <iostream> |
05 |
06 | #include "cocos2d.h" |
07 | #include "cocos-ext.h" |
08 |
09 | class MainScene |
10 | : public cocos2d::CCLayer |
11 | { |
12 | public : |
13 | static cocos2d::CCScene* scene(); |
14 | }; |
15 |
16 |
17 | #endif /* defined(__cocoBuilder__MainScene__) */ |
01 | #include "MainScene.h" |
02 |
03 | USING_NS_CC; |
04 | USING_NS_CC_EXT; |
05 |
06 | CCScene* MainScene::scene() |
07 | { |
08 | CCScene *scene = CCScene::create(); |
09 | |
10 | CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); |
11 | |
12 | CCBReader *reader = new CCBReader(lib); |
13 | |
14 | CCNode *node = reader->readNodeGraphFromFile( "MainScene.ccbi" , scene); |
15 | |
16 | reader->release(); |
17 | |
18 | if (node!=NULL) |
19 | { |
20 | scene->addChild(node); |
21 | } |
22 | |
23 | return scene; |
24 | } |
首先把HTML5前面的框勾掉,如图上!
下面是重点,Publish to directory ,也就是发布的路径选择。
前面提到过CocosBuilder的项目路径随便保存在哪里,但是它的发布需要设置了,
需要设置到你的cocos2dx项目的Resources文件夹下。
发布设置完了吗?点击下Done.
还没有发布呢,不是吗?点击File->Publish, OK了,CocosBuilder已经发布了!
离成功很近了!
找到cocos2dx项目cocoBuilder的Resources文件夹,看看都发布了哪些东西!
貌似东西还挺多的!(builder文件夹是我自己建的,没什么关系)。
把这些发布的添加到cocoBuilder的Resource工程里面去
看看添加的文件结构
这里就先添加这些吧!
运行一下,如果一次ok,恭喜你!
(我是搞了很久,貌似都是路径问题!试了好多遍!(很容易路径出问题))
运行成功的界面如下
OK,第一篇就这样吧,欢迎板砖,指导!有问题,共同探讨!
今天弄了一天,记录一下。
首先是版本。我用的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 MainMenuScene:public CCLayer,public CCBSelectorResolver,public CCBMemberVariableAssigner{
public:
CREATE_FUNC(MainMenuScene);
void enterPlay();
public:
//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 MainMenuSceneLoder :public CCLayerLoader{
public:
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MainMenuSceneLoder, loader);
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MainMenuScene);
};
好了,现在完成了定义。接下来是实现。
在相应的注册函数中注册关联。使用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;
}
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);
return false;
}
最后是载入调用。首先将相应的Layer与Loader注册到CCNodeLoaderLibrary中。然后用CCBReader读出来。最后调用reader的相应方法将资源解析出来。例如
CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary()->registerCCNodeLoader( "MainMenuScene", MainMenuSceneLoder::loader());
CCBReader* reader = new CCBReader( CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary() );
reader->autorelease(); // run
pDirector->runWithScene(reader->createSceneWithNodeGraphFromFile("MainMenuScene"));
就是这样了,问题在于每个都要写,一写还是两个(layer与Loader)。看着这代码真不爽。晚上回家想想有没有什么好办法改善一下。
对于上面这堆代码,Good Luck For You。