Cocos2d-x游戏开发之一 CocosBuilder编辑器使用

简言

CocosBuilderinterface builder 类似,是cocos2d下简单快速进行精灵,层,场景布局的工具。可以快速完美的进行菜单和交互场景的布局,是Cocos2d系列的配套开源工具,最新的版本是3.0

参考资料

CocosBuilder官网 

http://cocosbuilder.com/

从零开始学习CocosBuilder

http://article.ityran.com/archives/2614

安装

直接去官网下载从归档文件解压,并把它拷贝到应用程序文件夹




接下来,先上我将完成的的实例界面

目前的简单功能是,点击菜单Tutorial进入说明界面然后可返回到主菜单;

开始CocosBuilder

先在新建文件夹LineRunner,用于存放cocos2d-x工程和CocosBuilder工程

第一部分:在CocosBuilder中新建工程并构建好界面

在CocosBuilder中新建工程

在菜单中选择File\New\New Project,命名工程为LRCocosBuilder并保存到LineRunner目录

得到默认界面,这个不是我们要的,


首先,你需要删除MainScene.ccb文件,它只是程序默认创建的场景。

注意:你可能觉得通过CocosBuilder 工程去删除文件很直接,但我没能直接删除。Finder中删除MainScene.ccb和MainScene.js 如果有人知道简单的方式,请回复。

另外,CocosBuilder 3.0默认会是勾选js controlled,可以在cocosbuilder里面选择document->javascript controlled,把对勾去掉就可以了(注:会影响后的的菜单等事件的绑定,我在这还卡住了)。

第一步:准备所需的资源图片,把所有的资源文件复制到工程目录下的Resources,即可在Cocosbuilder看到。

接下来,选择File\New\New File,在下拉菜单中从菜单项中选择iPhone Landscape  iPhone 5 Landscape,另外确保根类型为CCLayer


第二步:开始构建界面

点击工具条的CCSprite按钮,添加一个 标题,背影精灵


设置精灵图片

接下来添加菜单,点击工具条的Menu,加入3个菜单项


其中先添加图中的1(菜单Menu),再添加2(菜单项CCMenuItemImageMenu),并先设置好图片属性,其中的事件绑定我们下面会说。。


我们可以从这Timeline里看到层次结构,这里在设置动画可会用到


第三步:我们完成了第一个界面,接下来关键的一步,将场景连接到类

当你通过CocosBuider 创建的CCLayer来设置场景时,如果你想使场景层为自定义类,你需要为CocosBuilder指明那个类。

例如,如果你用MainMenuScene初始化了一个场景并且你希望它的场景层是你自定义的类,你需要在CocosBuilder的代码连接区指明类名。

选中MainMenuScene.ccb,在TimeLineCCLayer根节点。



在右侧代码连接区设置自定义类为MainMenuLayer,这样当你初始化场景时,CocosBuilder会寻找名叫MainMenuLayer的类去初始化场景层。接下来是要发布CocosBuilder界面文件,点击File,选择Publish,这将在场景目录创建一个名字为MainMenuScene.ccbi的文件。

CocosBuilder介绍到这,接下来介绍如何在Cocos2D-x下工作。

第二部分,在cocos2d-x使用场景并绑定事件

首先确保你安装了最新的Cocos2D,写本文时是cocos2d-2.1rc0-x-2.1.3版。

新建一个cocos2d-x工程,命名为LineRuner,

1)将在CocosBuilder工程中用的图片资源添加到工程的Resources下,并确保“Copy items to destination group’s folder (if needed)”为选中状态,另外 LineRuner Target也为选中状态。

2)把在cocosBuilder工程生成的MainMenuScene.ccbi文件直接拖到Resources下,不要复制不要选中“Copy items to destination group’s folder (if needed)”,因为这样只是保持链接,而不用每次改动.ccbi文件都要复制到cocos2d-x工程下。

在LineRuner工程的class目录下新建目录layers,并新建一个C++文件MainMenuLayer.cpp,并修改MainMenuLayer文件

MainMenuLayer.h

#ifndef __LineRuner__MainMenuLayer__
#define __LineRuner__MainMenuLayer__

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
class MainMenuLayer : public cocos2d::CCLayer{
public:
    static cocos2d::CCScene* scene();
};
#endif /* defined(__LineRuner__MainMenuLayer__) */

MainMenuLayer.cpp

#include "MainMenuLayer.h"
#include "LRTutorialScene.h"
USING_NS_CC;
USING_NS_CC_EXT;

CCScene* MainMenuLayer::scene(){
    CCScene *scene = CCScene::create();
    CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
    CCBReader* reader = new CCBReader(lib);
    CCNode *node = reader->readNodeGraphFromFile("LRMainMenuScene.ccbi", scene);
    reader->release();
    if (node != NULL) {
        scene->addChild(node);
    }
    return scene;
}

修改AppDelegate.cpp中默认的启动scene

CCScene *pScene = MainMenuLayer::scene();
如果没有错误的话, 你应该可以看到运行的效果.


这时我们点击界面上的图片是没有反应的

下面来绑定菜单事件

我们再次打开cocosBuilder工程,在选中菜单项并设置调用方法,设置这两项即可


记得编辑完之后要Publish一下,才能反应到实际文件上。

回到Xcode,LineRunner工程,再次修改MainMenuLayer文件,添加几个函数

MainMenuLayer.h

#ifndef __LineRuner__MainMenuLayer__
#define __LineRuner__MainMenuLayer__

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
class MainMenuLayer : public cocos2d::CCLayer,
public cocos2d::extension::CCBSelectorResolver{
public:
    static cocos2d::CCScene* scene();
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MainMenuLayer, create);
    //菜单处理
    virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);
    //控件处理
    virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);

    //在CocosBuilder上绑定的方法
    void options(cocos2d::CCObject *pSender);
    void tutorial(cocos2d::CCObject *pSender);
    void play(cocos2d::CCObject *pSender);
};
class MainSceneLayerLoader : public cocos2d::extension::CCLayerLoader
{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MainSceneLayerLoader, loader);
protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MainMenuLayer);
};
#endif /* defined(__LineRuner__MainMenuLayer__) */

MainMenuLayer.cpp

#include "MainMenuLayer.h"
#include "LRTutorialScene.h"
USING_NS_CC;
USING_NS_CC_EXT;

CCScene* MainMenuLayer::scene(){
    CCScene *scene = CCScene::create();
    CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
    
    lib->registerCCNodeLoader("MainMenuLayer", MainSceneLayerLoader::loader());
    CCBReader* reader = new CCBReader(lib);
    CCNode *node = reader->readNodeGraphFromFile("LRMainMenuScene.ccbi", scene);
    reader->release();
    if (node != NULL) {
        scene->addChild(node);
    }
    return scene;
}
SEL_MenuHandler MainMenuLayer::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName)
{
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "options", MainMenuLayer::options);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "play", MainMenuLayer::play);
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "tutorial", MainMenuLayer::tutorial);
    return NULL;
}
SEL_CCControlHandler MainMenuLayer::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName){
    return NULL;
}
void MainMenuLayer::options(cocos2d::CCObject *pSender){
    CCLog("options");
}
void MainMenuLayer::play(cocos2d::CCObject *pSender){
    CCLog("play");
}
void MainMenuLayer::tutorial(cocos2d::CCObject *pSender){
    CCLog("tutorial");
}

运行项目,可看到点击每个菜单的输出Log...

最后一步,创建新的场景并在主菜单上进入。

按照上面的步骤在cocosBuilder上新建,名为LRTutorialScene的场景,并将layer的Custom class设置LRTutorialScene,在这里我们新加个UIControlButton 控件,并设置图片和点击事件


回到xcode,新建LRTutorialScene.cpp,C++文件,编写文件

LRTutorialScene.h

#ifndef __LineRuner__LRTutorialScene__
#define __LineRuner__LRTutorialScene__

#include <iostream>
#include "cocos-ext.h"
#include "cocos2d.h"
class LRTutorialScene
:public cocos2d::CCLayer
, public cocos2d::extension::CCBSelectorResolver{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(LRTutorialScene, create);
    virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);
    virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);
    void backMenuAction(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent);
};
class LRTutorialSceneLoader : public cocos2d::extension::CCNodeLoader
{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(LRTutorialSceneLoader, loader);
protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(LRTutorialScene);
};
#endif /* defined(__LineRuner__LRTutorialScene__) */

LRTutorialScene.cpp

#include "LRTutorialScene.h"

USING_NS_CC;
USING_NS_CC_EXT;

SEL_MenuHandler LRTutorialScene::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName){
    return NULL;
}
SEL_CCControlHandler LRTutorialScene::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName)
{
    CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "backMenuAction", LRTutorialScene::backMenuAction);
    return NULL;
}
void LRTutorialScene::backMenuAction(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent){
    CCLog("LRTutorialScene");
    CCDirector::sharedDirector()->popScene();
}

另外在MainMenuLayer.h文件上增加函数

    void openScene(const char * pCCBFileName, const char * pCCNodeName = NULL, cocos2d::extension::CCNodeLoader * pCCNodeLoader = NULL);

MainMenuLayer.cpp

void MainMenuLayer::openScene(const char * pCCBFileName, const char * pCCNodeName, cocos2d::extension::CCNodeLoader * pCCNodeLoader){
    CCScene *scene = CCScene::create();
    CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
    
    lib->registerCCNodeLoader(pCCNodeName, pCCNodeLoader);
    CCBReader* reader = new CCBReader(lib);
    CCNode *node = reader->readNodeGraphFromFile(pCCBFileName, scene);
    reader->release();
    if (node != NULL) {
        scene->addChild(node);
    }
    CCDirector::sharedDirector()->pushScene(scene);
}
在MainMenuLayer.cpp的tutorial函数上响应,

void MainMenuLayer::tutorial(cocos2d::CCObject *pSender){
    CCLog("tutorial");
    this->openScene("LRTutorialScene.ccbi","LRTutorialScene",LRTutorialSceneLoader::loader());
}

 运行项目,看结果吧。。

先到这吧,会继续更新这个例子,慢慢学慢慢加更多的功能。。
源码下载地址:

金山快盘:http://www.kuaipan.cn/file/id_88462402013626369.htm

CSDN


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值