CocosBuilder 与 Cocos2D-JS 的配合

在游戏开发中,制作一些漂亮直观的动画使用代码做起来会很繁琐,但是使用 CocosBuilder 实现起来就很容易直观。而且 CocosBuilder 也可以制作场景的布局,在布局中也可以加入一些交互动画,这样会让我们游戏更吸引人。
本文中 CocosBuilder 与 Cocos2D-JS 的配合方法来自于 js-test 。js-test 几乎包含了 Cocos2D-JS 中所有 API 的用法,推荐在平时遇到问题时可以先去 js-test 中寻找答案,一般都会得到满意的结果。
本文不再赘述 CocosBuilder 的建立工程、文件资源结构等方面,关于这些,网上都能找到很好的教程。
首先,我们制作了一个 CCB ,如图:

CCB.png

在这个 CCB 中,有一个根 Layer ,Layer 下包含了一个 ColorLayer 和 一个 Sprite 。在 Sprite 的时间轴中加入了一些关键帧用以让这个精灵动起来。

点击 File-Publish 后将 ccbi 文件和我们的资源文件一起拷贝进项目目录下的 res/ 下就可以使用这个动画了。在工程中,加载 ccbi 的代码如下:

    cc.BuilderReader.setResourcePath("res/");
    var node = cc.BuilderReader.load("res/testCCB/test.ccbi", this);
    node.x = 0;
    node.y = 0;
    this.addChild(node, 100);

cc.BuilderReader 是我们主要用到的对象。代码第一行设置了 CCBI 文件的路径,第二行加载了 CCBI 文件并赋给了一个 node ,这个 node 的输出为

     [object Layer] 

即 CCB 文件中的根 Layer 。最后,将它加入到了我们的场景中。

至此,已经完成 CCBI 文件的加载和显示,如果 CCB 中将 TimeLine 设置为 AutoPlay ,动画就已经开始播放了。

在代码中取得 CocosBuilder 中设置的各种 Node 的方法:

根 CCLayer :在 TimeLine 中点击我们加入的根 Layer ,然后打开 Inspector View ,在 Code Connection 中填入变量名,如图:

CCLayer.png

这样我们就可以通过这个变量名在代码中得到它,那要将它作为一个什么东西得到?得到了该如何使用?

我们使用如下代码打印一下刚才读入的 CCBI 文件,看看它的内部是什么样的:

for (var index in node){
        cc.log(index, node[index]);
}

控制台前几行的输出如下:

JS: animationManager    [object BuilderAnimationManager]
JS: controller    [object Object]
JS: __nativeObj    true

我们看到读入的 Layer 有这么三个属性,在这里,我们要读入 controller 这个属性。
首先在 TimeLine 中 Callback 那一栏加入几个回调点,(按住 alt,鼠标点击要加入的位置),然后双击新加入的点,设置 Selector 和 Target ,如图:

Callback.png

然后加入如下代码:

cc.BuilderReader.registerController("TestCCBLayer", {

"onCallback0" : function(sender){
    cc.log("TestCCBLayer Callback0");
},

"onCallback1" : function(sender){
    cc.log("TestCCBLayer Callback1");
},

"onCallback2" : function(sender){
    cc.log("TestCCBLayer Callback2");
},

"onCallback3" : function(sender){
    cc.log("TestCCBLayer Callback3");
},

运行,控制台的输出表明已经执行了回调函数。

以上,我们已经能通过回调函数取得动画的状态,这样可以在不同的时机来做一些操作。比如说动画中的怪物张嘴吃人我们就可以在回调函数中播放人被吃掉的动画等等。

具体的实现可以使用发送消息通知的方式:

cc.BuilderReader.registerController("TestCCBLayer", {

"onCallback0" : function(sender){
    cc.log("TestCCBLayer Callback0");
    cc.eventManager.dispatchCustomEvent("CCBCallback0");
},

"onCallback1" : function(sender){
    cc.log("TestCCBLayer Callback1");
},

"onCallback2" : function(sender){
    cc.log("TestCCBLayer Callback2");
},

"onCallback3" : function(sender){
    cc.log("TestCCBLayer Callback3");
},

在其他地方收取 “CCBCallBack0” 通知就可以了。

同时,我们还能读取根 Layer 下的精灵,并在代码中更新其状态,有了这个功能,我们既能使用 CocosBuilder 控制精灵的动作,又可以使用代码控制。这会使我们的游戏更加生动。

在 TimeLine 中点击我们要在代码中取得的任何 Node ,在 Inspector View 中的 Code Connection 中填入变量名,注意和根 Layer 的区别:

Sprite.png

我们的这个精灵的变量名就是 : testSprite ,一下代码就可以取得这个精灵了:

cc.BuilderReader.registerController("TestCCBLayer", {

"onCallback0" : function(sender){
    var actionSprite = this["testSprite"];
    cc.log("TestCCBLayer Callback0");
    cc.eventManager.dispatchCustomEvent("CCBCallback0", actionSprite);
},

"onCallback1" : function(sender){
    cc.log("TestCCBLayer Callback1");
},

"onCallback2" : function(sender){
    cc.log("TestCCBLayer Callback2");
},

"onCallback3" : function(sender){
    cc.log("TestCCBLayer Callback3");
},

在取得这个精灵后,使用消息通知传送给接收者,在接受者那边代码如下:

this._listener = cc.eventManager.addCustomListener("CCBCallback0", function(sender){
        cc.log("Get Event of Callback0");
        var actionSprite = sender._userData;
        actionSprite.setVisible(false);
});

运行,这个精灵在做完第一个动作后就消失了,成功~

我们的 controller 是使用代码根据在 CCB 文件中设置的回调函数名注册到 Layer 上的。我们可以输出一下这个 controller 看看它到底是什么,
代码:

var controller = node.controller;
    for (var index in controller){
        cc.log(index, controller[index]);
    }

控制台的输出 :

    JS: controllerName    TestCCBLayer
    JS: rootNode    [object Layer]
    JS: testSprite    [object Sprite]
    JS: onCallback0    function (sender){
        var actionSprite = this["testSprite"];
        cc.log("TestCCBLayer Callback0");
        cc.eventManager.dispatchCustomEvent("CCBCallback0", actionSprite);
    }
    JS: onCallback1    function (sender){
        cc.log("TestCCBLayer Callback1");
    }
    JS: onCallback2    function (sender){
        cc.log("TestCCBLayer Callback2");
    }
    JS: onCallback3    function (sender){
        cc.log("TestCCBLayer Callback3");
    }
    JS: constructor    function Class() {
        // All construction is actually done in the init method
        if (!initializing) {
            if (!this.ctor) {
                if (this.__nativeObj)
                    cc.log("No ctor function found! Please check whether `classes_need_extend` section in `ini` file like which in `tools/tojs/cocos2dx.ini`");
            }
            else {
                this.ctor.apply(this, arguments);
            }
        }
    }

眼熟嘛,不就是我们写的代码再加一点别的东西嘛。

controllerName : TestCCBLayer
说明 controller 就是这个 Layer ,可以使用 rootNode 取得我们的根 Layer ,而且我们的 testSprite 也在这里。同时多了一个构造函数,在这个函数中,使用 apply 方式调用了 ctor 。

感谢观赏,如有错误,欢迎指出~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,110评论 5 13
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,488评论 6 30
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,099评论 25 707
  • 还有一周就七夕了。 相信有人和我拥有着同款列表,就是突然被下面这张图刷屏了,并且大多数人抱着一种‘这种人居然可以有...
    全世界第1小可爱阅读 148评论 0 1
  • 我出生在湖北的一个农村,当时那里条件不是很好,记得上小学的时候由于学校搬迁,我们全部的同学还在别的学校读过几个星期...
    灵武113李丽阅读 281评论 0 0