首先,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';)
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();
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-x绑定ccb文件的更多相关文章

  1. 全自动ARP实时绑定BAT文件

    全自动ARP实时绑定BAT文件 说明一下,这个BVS脚本,它会每六秒钟清除一次ARP缓存.并绑定网关.真正做到了实时防护! 代码如下:请另存为.BAT文件.再运行一下,就可以了 path c:\;c: ...

  2. SpriteBuilder修改CCB文件中的子CCB文件需要注意的一个地方

    在SpriteBuilder中如果一个CCB(比如一个场景)中嵌入了另一个子CCB文件(比如一个player),那么当给该子CCB中的root对象添加若干属性的时候,必须注意到这个并没有应用到父CCB ...

  3. 【spring boot】3.spring boot项目,绑定资源文件为bean并使用

    整个例子的结构目录如下: 1.自定义一个资源文件 com.sxd.name = 申九日木 com.sxd.secret = ${random.value} com.sxd.intValue = ${r ...

  4. cocos2d(CCSprite绑定不规则刚体与精灵一起移动)

    对于不规则的精灵我们可以借助PhysicsEditor来制作shape , 对于地图可以使用Tiled软件制作瓷砖地图. 今天主要记录一下如何把CCSprite与不规则刚体进行绑定,然后一起移动 // ...

  5. slua中,绑定lua文件到Monobehavior的一种方法

    slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法: public class LuaBeha ...

  6. 040. asp.netWeb中TreeView控件绑定XML文件

    xml文件格式: <?xml version="1.0" encoding="utf-8" ?> <sitemap title="进 ...

  7. WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension

    问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...

  8. 使用eclipse XML catalog绑定dtd文件

    有时候我们想编辑struts或spring的xml配置文件的时候,输了“<”之后eclipse却没有提示关键字,这是因为eclipse需要到网络下载dtd文件而由于网络原因没下载下来所以无法提示 ...

  9. SpriteBuilder中关于大量CCB文件的数字命名建议

    开发者总是频繁的填充文件名字使用额外的0,以此来对抗长久以来的长痘:数字排序.如果你觉得在数字名字前添加额外的0是一个好主意,比如说Level0001,因为可能你会创建数以千记的关卡--请不要这样做! ...

随机推荐

  1. Redis + Jedis + Spring 实例(对象的操作)

        目录(?)[+] 不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 一.预期 接上 ...

  2. Flashback Drop实例操作

    1.Flashback DropFlashback Drop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle B ...

  3. 装Oracle12C时遇到没有权限访问临时位置的解决方法

    今天在装oracle12c是遇到了一个很奇怪的问题,显示是没有权限访问临时位置,可是我明明是用管理员的账号登陆的啊,最后在包姐的帮助下解决了,知其然,而我却不知其所以然.但还是把方法写下,希望能帮到一 ...

  4. MongoDB学习笔记03

    限制结果的返回数量可以使用limit.skip sort用一个对象作为参数:一组键/值对,键对应文档的键名,值代表排序的方向(1:升序,-1:降序):如果指定了多个键,则按照多个键的顺序诸个排序. M ...

  5. commit后数据库干的工作

    用户提交commit后,数据库干的工作有: 1,oracle为用户的transaction生成一个SCN号. 2,LGWR把redo buffer中的数据写入到redo log file,同时把SCN ...

  6. Oracle自治事务

    定        义: Autonomous transactions are independent transactions that can be called from within anot ...

  7. iOS-OC-基础-NSArray常用方法

    NSArray常用方法和属性 // ——————————————————————数组常用方法—————————————————————— // 1.计算数组元素的个数: count NSArray * ...

  8. iOS-OC-基础-NSString常用方法

    NSString常用方法和属性 //compare 比较字符串升序.相同还是降序,比较原理:首先比较第一个字符(ASCII码比较),如果是升序就为升序,如果相同比较下一个字符... NSString ...

  9. c++ 指针的简单用法

    对于指针,其实只需要明白几点就可以. 1.指针,是一个数值为地址的变量,这里尤其注意,指针变量的值是地址!就是例如40002这种像门牌号的地址值,其实就是内存中的一个编号. 2.&,该符号的意 ...

  10. Mysql常用命令行大全(转)

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...