原创:请注明转载!

在Cocos2d-x中使用CocosBuilder

使用自定义类

CocosBuilder的使用方法是通过自定义类。在CocosBuilder中选中一个对象并在属性栏中输入自定义类的类名就可以了。记住你的自定义类必须是你选中对象的一个子类(如CCLayer,CCNode等等)

当加载ccbi文件时,你需要定义两个自定义类(也可以是一个)。自定义的Loader类继承自cocos2d::extension::CCLayerLoader。

自定义的Layer类继承自
cocos2d::extension::CCBSelectorResolver
cocos2d::extension::CCBMemberVariableAssigner
cocos2d::extension::CCNodeLoaderListener

在你的自定义Loader类中你需要加入初始化代码:

public:

CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(CustomLayerLoaderClass,
loader);

CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(CustomLayerClass));

使用Loader类的loader方法,CCBReader可以初始化你的自定义Layer类。

请注意CCBReader不会使用任何自定义的init方法。如果要使用自定义的init方法,你可以在自定义Layer类的构造函数中调用。

关联成员变量

在ccbi中引用的对象可以在文件被加载时关联为成员变量。这些成员变量可以定义在文档的根节点中,在这种情况下它必须分配一个自定义类。

关联成员变量很简单,只要在头文件中声明它们就可以了。

如果要初始化成员变量,你可以在自定义Layer类中重载onAssignCCBMemberVariable方法并输入代码:

CCB_MEMBERVARIABLEASSIGNER_GLUE(this,
"sprtBurst", CCSprite *, this->mSprtBurst);

sprtBurst是在CocosBuilder中定义的属性名。

在CocosBuilder中选择对象,在Code Connections面板下把Don't assign变为Doc root var或者Owner var。然后在右边的文本框中输入成员变量的名字。

添加CCMenuItemImage的回调函数

为CCMenuItemImage添加一个点击事件的回调函数很简单,在CocosBuilder中选中CCMenuItemImage,在Selector右边的文本框中输入方法的名称即可,并设置target为Document root或者Owner。

回调函数将把CCMenuItemImage作为它的唯一参数(参数类型是id,名称一般是sender)。或者你也可以忽略这个参数。

在你的自定义类中,重载onResolveCCBCCMenuItemSelector方法并添加如下代码:

CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this,
"pressedA:", MenuTestLayer::onMenuItemAClicked);

在这个方法中,MenuTestLayer是你的自定义类名。

然后在你的cpp文件中,可以编写回调方法

void
MenuTestLayer::onMenuItemAClicked(cocos2d::CCObject *pSender) {

}

添加CCControl的回调函数

为CCControl添加一个回调方法和CCMenuItemImage基本相同,只需要加一些额外的东西。

首先勾选事件类型,CCControlButton一般的事件都是Up inside。Target右边的下拉菜单选择Document root或者Owner,然后输入回调方法名。这个回调方法可以有两个参数,sender和事件类型,事件类型被定义在CCControl.h中。

在自定义类中,重载onResolveCCBCCControlSelector方法并加入如下代码:

CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this,
"pressedMenus:", MenuTestLayer::onPressedMenus);

在这个方法中,MenuTestLayer是你的自定义类名。

然后在你的cpp文件中,可以编写回调方法

void
HelloCocosBuilderLayer::onMenuTestClicked(CCObject * pSender,
cocos2d::extension::CCControlEvent pCCControlEvent) {

}

加载ccb文件的选项

在加载CocosBuilder的文件前,CocosBuilder文档或者ccb文件需要以一种压缩的二进制格式发布——ccbi格式,一旦被发布,只要一行代码就可以简单地把它们加载到你的程序中。添加CCBReader.h
和 CCBReader.m文件到你的Cocos2D项目中(Cocos2d-x不用添加这些文件),然后调用nodeGraphFromFile方法,如下所示:

CCBReader
*ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);

CCNode*
myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi");

ccNodeLoaderLibrary的初始化有两种方法:

如果你使用的是自定义类,那么:

CCNodeLoaderLibrary * ccNodeLoaderLibrary =
CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader("HelloCocosBuilderLayer",
HelloCocosBuilderLayerLoader::loader());

在这种情况下,HelloCocosBuilderLayer是在CocosBuilder中指定的自定义类名。

如果没有使用自定义类,你可以初始化一个默认的NodeLoader

CCNodeLoaderLibrary * ccNodeLoaderLibrary =
CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();

根据ccbi文件中根节点的对象类型你需要对返回值做一下强制类型转换。比如,如果你加载的是一个CCParticleSystem,那么你需要如下代码:

CCParticleSystem*
myParticles = (CCParticleSystem*) ccbReader->readNodeGraphFromFile("MyParticleSystem.ccbi");

为了方便起见,CCBReader还可以把你的节点图打包在一个场景中,然后调用sceneWithNodeGraphFromFile方法:

CCScene*
myScene = ccbReader->sceneWithNodeGraphFromFile("MyScene.ccbi");

传递Owner变量

有时你可能需要访问另一个对象中的成员变量或者回调函数,而不是访问根节点中的变量和函数。这样的话,你就需要给CCBReader传递一个Owner参数。记住在CocosBuilder中声明变量或者回调函数的时候Target选择owner选项。然后调用CCBReader类的nodeGraphFromFile(file,
owner)方法或者sceneWithNodeGraphFromFile(file, owner)方法来加载你的文件。

HelloCocosBuilderLayer
*pOwner = new HelloCocosBuilderLayer();

CCNode*
myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi",
pOwner);

访问子ccb文件中的变量和回调函数

如果你使用了子ccb文件,并且指定root node作为目标,那么owner target就是你要传给CCBReader的对象。

示例

请参看HelloCocosBuilderLayer.h,
HelloCocosBuilderLayer.cpp,还有cocos2d-x官方包下面的TestCPP项目中的ExtensionsTest示例。

设置缩放和设计尺寸

基于CocosBuilder的cocos2d-x项目,在AppDelegate类中对游戏尺寸的适配进行了设置,它会自动地从相应的目录中加载相应的资源文件。它的原理是基于设备屏幕的大小。你同样需要对缩放系数和设计分辨率这两个参数进行设置。

竖屏模式下,在AppDelegate.cpp的AppDelegate::applicationDidFinishLaunching方法中加入代码:

CCSize
designSize = CCSizeMake(320, 480);

CCSize
resourceSize = CCSizeMake(320, 480);

CCSize
screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();

std::vector<std::string>
searchPaths;

std::vector<std::string>
resDirOrders;

TargetPlatform
platform = CCApplication::sharedApplication()->getTargetPlatform();

if
(platform == kTargetIphone || platform == kTargetIpad)

{

searchPaths.push_back("Published-iOS"); //
Resources/Published-iOS

CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);

if (screenSize.height > 768)

{

resourceSize = CCSizeMake(1536,
2048);

resDirOrders.push_back("resources-ipadhd");

}

else if (screenSize.height > 640)

{

resourceSize = CCSizeMake(768, 1536);

resDirOrders.push_back("resources-ipad");

}else if (screenSize.height > 480)

{

resourceSize = CCSizeMake(640, 960);

resDirOrders.push_back("resources-iphonehd");

}

else

{

resDirOrders.push_back("resources-iphone");

}

CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);

}

else
if (platform == kTargetAndroid || platform == kTargetWindows)

{

if (screenSize.height > 960)

{

resourceSize = CCSizeMake(640, 960);

resDirOrders.push_back("resources-large");

}

else if (screenSize.height > 480)

{

resourceSize = CCSizeMake(480, 720);

resDirOrders.push_back("resources-medium");

}

else

{

resourceSize = CCSizeMake(320, 568);

resDirOrders.push_back("resources-small");

}

CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);

}

pDirector->setContentScaleFactor(resourceSize.width/designSize.width);

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width,
designSize.height, kResolutionShowAll);

如果是横屏的模式,你只需要把分辨率宽高的顺序调整一下就好了。比如(320, 480)变为(480,320),(640, 960)变为(960, 640)等等。

Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类的更多相关文章

  1. Cocos2d-x——CocosBuilder官方帮助文档翻译3 动画

    Working with Animations 动画 You can use CocosBuilder for creating character animations, animating com ...

  2. Cocos2d-x——CocosBuilder官方帮助文档翻译2 多分辨率支持

    Working with Multiple Resolutions 多分辨率设置 A common scenario when creating apps or games is to target ...

  3. Android官方技术文档翻译——Gradle 插件用户指南(5)

    昨晚把第五章未译完的几句话攻克了.只是第六章没怎么译,明后天又是周末,假设周一前第六章翻译完的话,周一再发第六章. 本文译自Android官方技术文档<Gradle Plugin User Gu ...

  4. Android官方技术文档翻译——Gradle 插件用户指南(4)

    最近赶项目,白天基本没时间,只有晚上在家的时候才能看一看.昨天晚上只翻译完了第四章,今天就只发第四章吧. 本文译自Android官方技术文档<Gradle Plugin User Guide&g ...

  5. Android官方技术文档翻译——Gradle 插件用户指南(7)

    本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build- ...

  6. Android官方技术文档翻译——Gradle 插件用户指南(6)

    没想到翻译这篇<Gradle 插件用户指南>拖了差不多一个月,还跨年了.不过还好,在2号时终于一口气把剩下的给翻译完了(其实那天剩下的也就不到一章). 今天先发一下第六章,明天再发第七章. ...

  7. google官方的下拉刷新+自定义上拉加载更多

    转载请标注转载:http://blog.csdn.net/oqihaogongyuan/article/details/50949118 google官方的下拉刷新+自定义上拉加载更多 现在很多app ...

  8. Android官方技术文档翻译——ApplicationId 与 PackageName

    本文译自androd官方技术文档<ApplicationId versus PackageName>,原文地址:http://tools.android.com/tech-docs/new ...

  9. Android官方技术文档翻译——Ant 任务

    本文译自Android官方技术文档<Ant Tasks>,原文地址:http://tools.android.com/tech-docs/ant-tasks. 由于是抽着时间译的.所以这篇 ...

随机推荐

  1. 如何在VS2010中使用Async功能?

    伴随C#5.0的发布,“异步”特性越来越深入人心:在VS2012中早就可以使用它大大简化异步编程的痛苦,那么在VS2010中呢?我们无法尝鲜么?答案是“No”!,其实我们可以这样做: 1)必须把你的V ...

  2. 【转】Java多线程学习

    来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ...

  3. gitHub for windows设置网络代理

    在公司网络环境下使用gitHub,一直出错,因为公司使用的代理.但是gitHub for windows无法设置代理. 可以通过C:\Users\admin\.gitconfig中,添加代理. 添加: ...

  4. UVa 10900 (连续概率、递推) So you want to be a 2n-aire?

    题意: 初始奖金为1块钱,有n个问题,连续回答对i个问题后,奖金变为2i元. 回答对每道题的概率在t~1之间均匀分布. 听到问题后有两个选择: 放弃回答,拿走已得到的奖金 回答问题: 如果回答正确,奖 ...

  5. [POJ 2429] GCD & LCM Inverse

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10621   Accepted: ...

  6. CSS预处理器Sass(Scss)、Less、Stylus

    CSS 预处理编译器能让我成程序化其的方式编写CSS代码,可以引入CSS中没有的变量.条件.函数等特性,从而让代码更简单易维护,但一般按预处理器语法编写的代码无法直接在浏览器中运行,需用通过工具比如g ...

  7. C++ 学习资料搜寻与学习(第一期)(未完待续)

    一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...

  8. 淘宝JAVA中间件Diamond详解(2)-原理介绍

    淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...

  9. HDU 4003-Find Metal Mineral(树状背包)

    题意: n个节点的树给出每个边的权值,有k个机器人,求由机器人走完所有节点的最小花费(所有机器人开始在根节点) 分析: 仔细看了几遍例题后,发现这个题的状态很巧妙,先从整体考虑,一个机器人走完所有边回 ...

  10. 如何制作网页小动画?——gif or png

    一.场景与动画 为了拉动网站氛围,或者吸引用户浏览焦点,需要使用一些小动画.这种动画不是(gif)单纯的重复,而是需要需要一些控制和交互,比如在动画完成后打开一个对话框.动画有几个基本要素(时间控制, ...