cocos2d-x绑定ccb文件

2024-01-20 05:58
文章标签 绑定 cocos2d ccb

本文主要是介绍cocos2d-x绑定ccb文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        首先,ccb文件是如何生成的,我就不多说了,大家可以搜下cocosbuilder,就能找的相关的教程,而通过cocosbuilder,我们可以省去了很多设计的麻烦,比如设计一个精灵的位置啥的,而通过cocosbuilder,我们可以把我们编码的重点放到具体的控制类上面,而不是在显示页面上下很大的功夫。闲话不多说,要想实现这些好处,首先确定你的Cocos2d-x的版本号,如果是2.0.4,那就用cocosbuilder 2.1吧(当然,cocosbuilder只有mac版的,如果是windows,那就用cocostudio吧),如果cocos2d-x是2.1以上版本,就用cocosbuilder3.0以上版本吧,比如我用的是cocos2d-x2.1.4,我的cocosbuilder为3.0.4。

        首先,来看下绑定代码吧 (GameScene.h)

#ifndef __loading__GameScene__
#define __loading__GameScene__#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"USING_NS_CC;
USING_NS_CC_EXT;class GameScene :public CCLayer
,public CCBMemberVariableAssigner
,public CCNodeLoaderListener
,public CCBSelectorResolver
{
public:virtual bool init();void onEnter();void onExit();static CCScene *scene();CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(GameScene, create); //如果此处提示GameScene有错误,要么是下面的虚函数没有重写完,要么是重写的方法中参数有误(例如:Allocating an object of abstract class type 'GameScene';),当然,这个方法也是可以去掉的,直接用CREATE_FUNC(GameScene)能达到相同的效果。    
virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);virtual void onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader);    virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);virtual SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);void NewGame(CCObject* sender);void ContinueGame(CCObject* sender);void CloseGame(CCObject* sender);void AboutGame(CCObject* sender);void setAnimationManager(CCBAnimationManager* value);CCLabelTTF* helloLabel;};class GameSceneLoader:public cocos2d::extension::CCLayerLoader{      //这个类也可以完全剥离成一个单独的文件
public:CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(GameSceneLoader, loader);
protected:CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(GameScene);};#endif /* defined(__loading__GameScene__) */
GameScene.cpp文件:

#include "GameScene.h"
#include "AboutGameScene.h"
bool GameScene::init()
{if(!CCLayer::init()){return false;}return true;
}
void GameScene::onEnter()
{CCLayer::onEnter();
}
void GameScene::onExit()
{CCLayer::onExit();
}
CCScene* GameScene::scene()
{CCScene* scene = CCScene::create();CCNodeLoaderLibrary* lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();lib->registerCCNodeLoader("GameScene", GameSceneLoader::loader());//要绑定的类名(即使实际的类名是以小写字母开头的,此处仍必须改为大写字母,否则,读取时直接报错,比较符合类名大写的命名规范),注册文件CCBReader* reader = new CCBReader(lib);CCNode* node = reader->readNodeGraphFromFile("TestGameScene.ccbi",scene);   //要读取的文件名,当前对象reader->release();                                       //记得要释放if (NULL!=node) {scene->addChild(node);}return scene;
}
// 将变量名字与变量做映射  
bool GameScene::onAssignCCBMemberVariable(cocos2d::CCObject *pTarget, const char *pMemberVariableName, cocos2d::CCNode *pNode){CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "helloLabel", CCLabelTTF*, helloLabel);return true;
}
// 当此场景加载完成后,如果需要做一些操作,则在此方法中添加  
void GameScene::onNodeLoaded(cocos2d::CCNode *pNode, cocos2d::extension::CCNodeLoader *pNodeLoader){helloLabel->setString("hello cocosbuilder");
}
//将menu与具体的函数绑定
SEL_MenuHandler GameScene::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName)
{CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "NewGame", GameScene::NewGame);CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "CloseGame", GameScene::CloseGame);CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "AboutGame", GameScene::AboutGame);CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "ContinueGame", GameScene::ContinueGame);return NULL;
}
// 将CCControl名字与响应函数做映射,也就是通过cocosbuilder中的Control(cccontrolbutton)创建的对象
SEL_CCControlHandler GameScene::onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName){//CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onPressButton", MainScene::onPressButton);return NULL;
}void GameScene::NewGame(CCObject *sender)
{helloLabel->setString("NewButton pressed.");
}
void GameScene::AboutGame(CCObject *sender)
{CCScene *returnback=AboutGameScene::scene();   //要切换到的场景CCDirector::sharedDirector()->setDepthTest(true); //开启深度检测CCTransitionScene *tmpaction=CCTransitionMoveInR::create(1.2,returnback);  //切换方法CCDirector::sharedDirector()->replaceScene(tmpaction);   //切换的另一个ccb文件中
}
void GameScene::CloseGame(CCObject *sender)
{helloLabel->setString("CloseButton pressed.");
}
void GameScene::ContinueGame(CCObject *sender)
{helloLabel->setString("ContinueButton pressed.");
}
//如果ccb文件中有动画,那就在这里设置控制吧
void GameScene::setAnimationManager(cocos2d::extension::CCBAnimationManager *value){}
另一个绑定AboutGameSceneLoader.h代码

#ifndef loading_AboutGameSceneLoader_h
#define loading_AboutGameSceneLoader_h
#include "AboutGameScene.h"
class AboutGameSceneLoader:public cocos2d::extension::CCLayerLoader{
public:CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(AboutGameSceneLoader, loader);
protected:CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(AboutGameScene);};#endif
AboutGameScene.h代码:

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"USING_NS_CC;
USING_NS_CC_EXT;class AboutGameScene :public CCLayer
,public CCBMemberVariableAssigner
,public CCNodeLoaderListener
,public CCBSelectorResolver
{
public:bool init();void onEnter();void onExit();static CCScene *scene();                                                                                                                                CREATE_FUNC(AboutGameScene);   //CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(AboutGameScene, create);virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);virtual void onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader);virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);virtual SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);void backMenu(CCObject* sender);void setAnimationManager(CCBAnimationManager* value);CCLabelTTF* helloLabel;};
AboutGameScene.cpp代码:

#include "AboutGameScene.h"
#include "GameScene.h"
#include "AboutGameSceneLoader.h"
bool AboutGameScene::init()
{if(!CCLayer::init()){return false;}return true;
}
void AboutGameScene::onEnter()
{CCLayer::onEnter();
}
void AboutGameScene::onExit()
{CCLayer::onExit();
}
CCScene* AboutGameScene::scene()
{CCScene* scene = CCScene::create();CCNodeLoaderLibrary* lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();lib->registerCCNodeLoader("AboutGame", AboutGameSceneLoader::loader());CCBReader* reader = new CCBReader(lib);CCNode* node = reader->readNodeGraphFromFile("AboutGameScene.ccbi",scene);reader->release();if (NULL!=node) {scene->addChild(node);}return scene;
}bool AboutGameScene::onAssignCCBMemberVariable(cocos2d::CCObject *pTarget, const char *pMemberVariableName, cocos2d::CCNode *pNode){return true;
}void AboutGameScene::onNodeLoaded(cocos2d::CCNode *pNode, cocos2d::extension::CCNodeLoader *pNodeLoader){CCSize size=CCDirector::sharedDirector()->getWinSize();CCSprite *mainsprite=CCSprite::create("catBody1.png");addChild(mainsprite,1);CCAnimation *animation=CCAnimation::create();animation->addSpriteFrameWithFileName("catBody1.png");animation->addSpriteFrameWithFileName("catBody2-4.png");animation->addSpriteFrameWithFileName("catBody3.png");animation->addSpriteFrameWithFileName("catBody2-4.png");animation->setDelayPerUnit(0.1f);//设置动画的间隔时间animation->setRestoreOriginalFrame(true);//是否返回第一帧mainsprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));mainsprite->setPosition(ccp(size.width/4, size.height/3));}SEL_MenuHandler AboutGameScene::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName)
{CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "backMenu", AboutGameScene::backMenu);return NULL;
}SEL_CCControlHandler AboutGameScene::onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName){return NULL;
}void AboutGameScene::backMenu(CCObject *sender)
{CCScene *returnback=GameScene::scene();   //要切换到的场景CCDirector::sharedDirector()->setDepthTest(true); //开启深度检测CCTransitionScene *tmpaction=CCTransitionMoveInR::create(1.2,returnback);  //切换方法CCDirector::sharedDirector()->replaceScene(tmpaction);}void AboutGameScene::setAnimationManager(cocos2d::extension::CCBAnimationManager *value){}
这些代码和以上的功能相同,贴出来只是让你进一步了解。

最后的实现效果:

         

另外,如果你在实现时,出现黑屏,并且控制台提示Cocos2d: Get data from file(xxx.ccbi) failed!,这种情况产生的原因有以下几种:

1、文件名书写错误,比如ccb.ccbi写成了cbb.ccbi;或者路径错误,总是就是导致文件找不到;

2、xxx.ccbi没有添加到资源中,导致文件找不到。



欢迎转载,转载请注明出处:http://blog.csdn.net/somestill/article/details/11194417

这篇关于cocos2d-x绑定ccb文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625007

相关文章

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生

使用http-request 属性替代action绑定上传URL

在 Element UI 的 <el-upload> 组件中,如果你需要为上传的 HTTP 请求添加自定义的请求头(例如,为了通过身份验证或满足服务器端的特定要求),你不能直接在 <el-upload> 组件的属性中设置这些请求头。但是,你可以通过 http-request 属性来自定义上传的行为,包括设置请求头。 http-request 属性允许你完全控制上传的行为,包括如何构建请求、发送请

springMVC 参数绑定的注解

本文介绍了用于参数绑定的相关注解。 绑定:将请求中的字段按照名字匹配的原则填入模型对象。 SpringMVC就跟Struts2一样,通过拦截器进行参数匹配。 代码在 https://github.com/morethink/MySpringMVC URI模板变量 这里指uri template中variable(路径变量),不含queryString部分 @PathVariable

【SpringMVC学习04】SpringMVC中的参数绑定总结

众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springmvc中如何接收前台页面的参数,即springmvc中的参数绑定问题。 1. 参数绑定的过程 我们可以回忆一下,在struts2中,是通过在Action中定义一个成员变量来接收前台传进来的参数,而在

Cocos2d-x自适应Android屏幕分辨

ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^. 对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。 1:ViewAutoScale 写了一个ViewAutoScale函数,如下:   #include "ViewAuto