CocosBuilder学习之二:把ccbi导入到项目中

CocosBuilder学习之二:把ccbi导入到项目中


最近都比较忙,所以本来该早就出来的这篇文章迟迟没能写出来。今天终于赶上公司搬工位,也没有什么具体安排,就抽个时间写这篇文章。这次我们主要介绍的是CocosBuilder编辑好的文件如何在项目中使用。

第一步,我们新建一个CocosBuilder项目,起个名字叫做NewCCB,新建一个编辑文件,起名字叫做Layer1.ccb ,然后把其中认为没有用的文件删除掉。添加进两个图片,最后的工程文件如图所示CocosBuilder学习之二:把ccbi导入到项目中_第1张图片

现在我们的目录下只剩下了三个文件,其余的全部删除掉,然后我们加入一个CCLabelTTF,把文本标签设为“按钮”,然后加入两个CCControlbutton,这里给大家推荐一下,推荐大家用CCControlbutton,因为它的功能要更加全面,也更符合现在其它平台的按钮的设计思想,我们把第一个按钮的图片设为button_3_n.png ,把第二个按钮的图片设为button_4_n.png,这里需要注意,每个CCControlbutton都是有三种状态的,State Normal正常状态,State Highlighted当按下时,按钮变为高亮状态,这个时候就会显示这个图片,因为按钮会有一个放大的效果,所以我们就设为同一张图片,这样起到了节约资源的作用,同时又不影响按钮的正常使用。两个按钮的图片都设置好之后,我们还要设置按钮的显示大小这里就是Preferred size,我们查看一下图片的大小

我们看到图片的尺寸是195x92,所以为了让按钮显示正常,我们也要设成这个尺寸。如下图

CocosBuilder学习之二:把ccbi导入到项目中_第2张图片


现在显示已经没有问题了,然后我们给按钮设置相应事件,如下图设置


Selector是说给一个key,用这个key来连接到程序中,Target我们选择的是根节点,也就是这个类本身。


然后我们再设置按钮Label,把它设置成一个成员变量,如下图

这里选的是Doc root var,也就是根节点的成员变量,起名字叫做title,这里也是连接进程序的一个key。

但是现在我们看到了JS Controller,我们不需要JS ,所以我们去掉勾选JS Controller,如下图



然后我们选中根节点Layer,如下图


在右上角的 Custom class设置为 Layer1,这是我们将要连接进的代码中的类的名字。最后我们保存项目,并发布,File>>Save all ,File >>Publish。这时我在工程目录下会看到多了两个文件夹,一个是Published_IOS,另一个是Published_Html5,这是在工程配置里面配置的,如下图



我们现在不需要他们,我们只需要一个ios平台的就好了,这是我们点 File>Publish Settings 在这里设置发布选项,把红圈圈住的复选框勾选或者去掉勾选。

我们就会只得到一个二进制文件的导出文件。

CocosBuilder学习之二:把ccbi导入到项目中_第3张图片


这时候我们只有一个叫做Layer1.ccbi的文件了,然后我们把整个工程文件夹放入我们新建的Xcode项目中。

下面是我贴出的代码

<span style="font-size:18px;">//
//  Layer1.h
//  NewCCBI
//
//  Created by 江南岸 on 14-7-4.
//
//

#ifndef __NewCCBI__Layer1__
#define __NewCCBI__Layer1__

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;

class Layer1 : public CCLayer,
                public CCBSelectorResolver,         
                public CCBMemberVariableAssigner,
                public CCNodeLoaderListener
{
    
private:
    
    CCLabelTTF *title;
  
public:
    Layer1();
    ~Layer1();
    CREATE_FUNC(Layer1);
    void buttonClick(CCObject *obj, CCControlEvent evet);
    static Layer1* showLayer1();
    
    
    //================ 继承自 CCBSelectorResolver ================
    /** 用来注册CCMenuItem的点击事件 */
    virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);
    /** 用来注册回调函数,一般用在动画中的回调*/
    virtual SEL_CallFuncN onResolveCCBCCCallFuncSelector(CCObject * pTarget, const char* pSelectorName);
    /** 用来注册CCControlButton的点击事件*/
    virtual SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);
    
    
    //================= 继承自CCBMemberVariableAssigner ==========
    /** 用来注册Cocos2d支持的类型(CCNode及其子类)变量*/
    virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);
    /** 用来注册CCBValue类型的变量*/
    virtual bool onAssignCCBCustomProperty(CCObject* pTarget, const char* pMemberVariableName, CCBValue* pCCBValue);

    //===================== CCNodeLoaderListener ========================
    /** 当初始化完所有结点之后,调用这个函数*/
    virtual void onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader);
    
};

/*
 * 加载器,需要每个界面定义一个类来继承它,这里我们简单地写成了一个宏
 * 只需要传递loader的类名字和View的类名字这样就可以了
 */

#define CREATELOADER(LOADERCLASS,VIEWCLASS)     class LOADERCLASS : public CCLayerLoader                            \
{                                                                   \
public:                                                         \
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD( LOADERCLASS, loader );\
protected:                                                      \
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD( VIEWCLASS );   \
};


CREATELOADER(Layer1Loader, Layer1);

#endif /* defined(__NewCCBI__Layer1__) */
</span>


<span style="font-size:18px;">//
//  Layer1.cpp
//  NewCCBI
//
//  Created by 江南岸 on 14-7-4.
//
//

#include "Layer1.h"

Layer1* Layer1::showLayer1()
{
    CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
    CCBReader *reader = new CCBReader(lib);
    lib->registerCCNodeLoader("Layer1", Layer1Loader::loader());
    CCNode *node = reader->readNodeGraphFromFile("Layer1.ccbi");
    return (Layer1*)node;
}

Layer1::Layer1()
: title(NULL) //注意,C++默认初始化的变量是随机值,所以一定要初始化
{
    CCLOG("Layer1()");
}

Layer1::~Layer1()
{
    CCLOG("~Layer1");
}

//当按钮点击时调用它
void Layer1::buttonClick(CCObject *obj, CCControlEvent evet)
{
    CCControlButton *btn = (CCControlButton*)obj;
    switch(btn->getTag())
    {
        case 101: // 关闭按钮
            CCLOG("关闭");
            title->setString("关闭");
            break;
        case 102: // 登录按钮
            CCLOG("登录");
            title->setString("登录");
            break;
    }
}

SEL_MenuHandler Layer1::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName)
{
    //CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(TARGET, SELECTORNAME, METHOD);
    //我们没有使用CCMenuItem
    return NULL;
}

SEL_CallFuncN Layer1::onResolveCCBCCCallFuncSelector(CCObject * pTarget, const char* pSelectorName)
{
    //CCB_SELECTORRESOLVER_CALLFUNC_GLUE(TARGET, SELECTORNAME, METHOD);
    //我们没有使用任何回调函数
    return NULL;
}

SEL_CCControlHandler Layer1::onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName)
{
    //还记得我们使用了“buttonClick:”这个回调吗,现在我们在这里注册它
    CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "buttonClick:",Layer1::buttonClick);
    return NULL;
}

bool Layer1::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode)
{
    /***
     *      把CocosBuilder里面的CCLabelTTF控件与Layer1中的变量绑定在一起
     *      CocosBuilder中通过字符串 “title” 与变量 title绑定在一起
     ***/
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "title", CCLabelTTF*, title);
    return false;
}

bool Layer1::onAssignCCBCustomProperty(CCObject* pTarget, const char* pMemberVariableName, CCBValue* pCCBValue)
{
    //    CCB_MEMBERVARIABLEASSIGNER_GLUE(TARGET, MEMBERVARIABLENAME, MEMBERVARIABLETYPE, MEMBERVARIABLE);
    return false;
}

void Layer1::onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader)
{
    // do nothing
}
</span>

CocosBuilder学习之二:把ccbi导入到项目中_第4张图片






你可能感兴趣的:(xcode,cocos2d-x,cocosBuilder)