在Cocos2d-x中使用CocosBuilder
在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(); |
在这种情况下,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); |
在Cocos2d-x中使用CocosBuilder相关推荐
- 浅谈cocos2d游戏中天气系统的简单实现
一.前言 此博客由一个新手游戏程序编写,没有高深的技术,基本是天气效果表现和代码设计的浅谈,如果有更好的实现方法,欢迎指正. 二.背景 该系统设计背景:2D游戏.正交45度表现地图.以及同一张地图上存 ...
- 【IOS】如何在cocos2d 游戏中添加 移动广告
最近有需要在一款Cocos2d 游戏里面添加移动广告,大家都知道,现在有很多的移动广告平台,每个平台都有自己的SDK,每个SDK的方法,流程又都不一样,找来找去,找到了 果合移动广告. 它自己的网站上 ...
- 如何在Cocos2D游戏中实现A*寻路算法(五)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Cocos2d—android 中常用的工具类
<span style="font-size:18px;"> 在开发游戏过程中通常会用到一个经常编写的重复的代码,比如加载游戏地图,从地图中加载指定点的集合,序列帧的播 ...
- 如何在Cocos2D游戏中实现A*寻路算法(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- cocos2d JS 中的数组拼接与排序
1 var arrA = [];//创建三个局部变量的新数组 2 var arrB = []; 3 var arrC = []; 4 var newCards = this.MyMahjong;//创 ...
- 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比(一家之言)
初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 发布于:2013-07-18 11:00阅读数:1984 ...
- [cocos2dx开发技巧2]工具CocosBuilder的使用--集成
转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8756467 本文主要侧重于CocosBuilder在cocos2dx中的集成.对Coc ...
最新文章
- python输入输出-python 输入输出 - 刘江的python教程
- 骁龙660是32位还是64位_都是搭载骁龙660处理器 这三款国产手机如何选
- 推荐干货 | 我在阿里做运营:八一八运营经典误区
- 【Servlet】response对象给用户返回数据
- AI面试必备!你不可不知的10个深度学习方法
- LeetCode 1265. 逆序打印不可变链表(递归)
- 送书 | 耗时很长的程序忘加nohup就运行了怎么办?
- bzoj1925地精部落——数学
- 如何让Windows 只显示某些文件扩展名
- SLAM_SLAM中一般是如何求解相机的运动的?
- 网 络 响 应 状 态 码 常 见 的 错 误 代 码 及 错 误 原 因
- 天翼校园客户端拨号服务器无响应,天翼校园客户端问题总结及解决办法
- 手机、电话号码、邮箱、域名、身份证号的测试用例
- 绕过微信客户端授权,获取网页源码
- deepin linux 命令行_deepin-linux常用命令大全----每天一个linux命令 - 子成君-分享出去,快乐加倍!-旧版已停更...
- 【hexo】基础教程-六-添加百度统计和Google统计
- Python超市进销存管理系统!老妈开超市有系统了!
- Dell OptiPlex台式机安装ESXI 6.7
- 【Python turtle】使用turtle实现随机满天星星效果(完整代码+效果图)
- OBS第三方推流直播教程
热门文章
- 【菜鸡的LeetCode答案】【C#】7.反转整数
- G502使用计算机配置,罗技G502鼠标驱动调试详解!实战《男友4》设置!
- 月球探测器中的计算机技术,月球探测器自主视觉导航技术的研究
- 六轴机器人轨迹规划之matlab画直线
- 对外汉语偏误语料库_哇,9大对外汉语必备语料库,每个都很有“性格”!!...
- matlab画图函数之plot【matlab图行绘制一】
- 吃着热狗就把数学整明白了?
- 从图书馆进入网络刷题练习与考试平台
- Svn分支管理的使用(三)
- 计算机五笔打字员,mac五笔打字软件 五笔打字员mac