Cocos 中的脚本绑定

语言绑定技术

绑定技术是指在目标语言中创造一套简单的 API 接口并将它指向另一种语言中的实际实现。往往其功能的实现非常庞大复杂,可能是目标语言所无法承载的,但是通过这种方式可以使目标语言具备使用这些功能的能力。


Cocos中的脚本绑定

早在2012年,时任 Zygna 工程师的 Rolando Abarca 主导开发了一套基于 Cocos2d-x 和 SpiderMonkey 的 JavaScript 自动绑定技术。这套绑定技术将 Cocos2d-x 的 C++ API 暴露到了JavaScript 语言中,使得开发者可以使用 JavaScript 来编写游戏代码,并享受 C++ 底层引擎框架高性能。后来 Cocos2d-x 团队的成员用同样的框架导出了 Lua API,完成了 C++ 到 Lua 的绑定。

这也是目前 Cocos 中脚本绑定技术的根基,由 Cocos 团队一直维护至今。目前 Cocos 的三种语言支持 C++/Lua/JS,其中的 Lua 和 JS 就是脚本绑定技术的成果。


绑定基本框架

让我们来先看一下 Cocos 引擎脚本绑定技术的框架图:

可以看到 JS 绑定和 Lua 绑定技术的结构是一致的,让我们自底向上一层一层解析:

  1. 首先在最底层的是 Cocos2d-x 的 C++ 实现,绑定技术归根结底只是将其实现的功能暴露到对应的语言层。
  2. 往上一层是 JavaScript 和 Lua 的脚本引擎,其中 JS 绑定使用的是 SpiderMonkey 作为JavaScript引擎。SpiderMonkey是由 Mozilla 维护的世界上第一个 JavaScript 引擎,也是目前 JavaScript执行性能最优秀的引擎之一
  3. 脚本引擎这一层提供了两个重要的能力:首先当然是执行脚本的能力,但是最重要的是它还提供了对脚本层进行访问的 C API。第二个能力成为了 C++ 引擎到脚本层的桥梁,让 C++ 可以截获脚本层的 API 调用,访问脚本环境中的变量,构造新的对象,主动调用脚本层的函数等。
  4. 在脚本引擎提供的 C API 基础之上,Cocos 引擎中通过两种方式将 C++ API 暴露到脚本层:自动绑定和手动绑定。同时,使用纯脚本实现来改造一些 API 让其更适合脚本程序员的习惯,并且提供一些不需要绑定的 API。这三者共同构成了脚本层 API。
  5. 有了脚本层的 API,开发者们自然就顺理成章得可以使用脚本来开发 Cocos 游戏了。


关于自动绑定

自动绑定技术是 Cocos 引擎最引以为傲的利器之一,为什么说它是 Cocos 脚本绑定技术的根基呢?绑定本身并不困难,有了脚本引擎和它的 API 就可以完成,真正困难在于以下几点:

  1. 如何将 Cocos 中如此巨量的 C++ API 全部绑定出来?
  2. 因为 Cocos 的版本迭代所带来的变化势必会影响到其绑定代码,那么如何保证绑定代码的可维护性?
  3. 如何让一个不懂得绑定技术的人也可以为他所做的功能提供脚本绑定?

正因为这些困难,自动化的绑定技术才真正让 Cocos 的脚本绑定成为现实。目前 Cocos 内部主要的绑定代码都是由自动绑定工具生成的,并且版本迭代当中,都会根据代码修改自动更新自动绑定代码。除此之外,用户也可以自由使用自动绑定工具绑定自己编写的 C++ 类。

Cocos 中的自动绑定技术基于Bindings Generator 工具,配合上 C++ 类配置信息,通过扫描 C++ 类的头文件,Bindings Generator 就可以生成所有公有 API 的脚本绑定代码。


关于手动绑定

虽然 Bindings Generator 已经非常强大,但是它依然有其局限性。目前的 Bindings Generator 的局限性主要是以下的几点:

  1. 只能够针对类生成绑定,不可以绑定结构体,独立函数等
  2. 不能够生成 Delegate 类型的 API,因为脚本中的对象是无法继承 C++ 中的 Delegate 类并重写其中的 Delegate 函数的。
  3. 子类中重写了父类的 API 的同时,又重载了这个 API。
  4. 部分 API 实现内容并没有完全体现在其 API 定义中。
  5. 在运行时由 C++ 主动调用的 API。

对于这些类型的 API,我们就需要通过手动编写绑定代码来将这些 API 绑定到脚本层。手动绑定出来的绑定代码的基本原理和自动绑定一致,只是自动绑定因其局限性绑定出来的内容可能会导致编译失败或者行为错误。

前三种类型的 API 通过手动绑定都可以解决,但是第四种类型,无法简单通过绑定来实现。因为绑定技术实现的是将 C++ 暴露到脚本层,使得脚本层可以调用 C++ 层实现的 API。而从 C++ 调用的 API,并不能主动得调用到脚本层,这是相反的过程。所以就需要在 C++ 源码中做一些特殊的处理,比如 Cocos 中 Node 类的 onEnter,update 函数,都有做类似的处理。同时,Cocos 中的 Action 类,都无法在脚本层被继承,根本原因也在于此,脚本层重写的 update 函数无法被 C++ 的 ActionManager调用到

Cocos 中的脚本绑定的更多相关文章

  1. 解析html5 canvas实现背景鼠标连线动态效果代码

    流行的动态背景连线特效。今天小编通过实例代码给大家解析html5 canvas实现背景鼠标连线动态效果,感兴趣的朋友一起看看吧

  2. ios – 如何使对象ID具有人类可读性?

    故事板上的每个UIView都有一个唯一的对象ID,类似于:kvf-NI-koG我想知道有没有办法让这个更友好,例如’myLabel’?

  3. Swift语言和其他计算机语言的比较

    Swift集成了传统面向对象编程语言的特性,同时又具备函数式编程的一些特征。在2014年WWDC之前,用来开发iOS应用的语言被称为Objective-C,它是标准C语言的扩展。使用Objective-C可以完成C语言所能完成的任何工作。这里不得不提到C++语言,事实上C++和Objective-C语言几乎是同时出现的。和Objective-C语言的简洁不同,C++语言几乎包含了所有可能的特性。

  4. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  5. Swift Name Mangling - Swift语言的名字重整技术

    在比如C这样的语言中,任何给定的名字(符号)只能对应唯一的一个函数或数据,不需要名字重整。因此,c++编译器使用一组严格的编码规则“mangles”(重整)了符号。想获取更多的关于经典C++编译器重整名字的内容,请参考ItaniumC++ABIdocumentation.总结:Object-C类似于C语言,Swift类似于C++,有函数重载,有虚函数表,需要命名重整。

  6. 你是如何评价Swift的,谈谈你的感受!

    假如之前已经掌握了Objective-C,切换到Swift也不难。Swift还没有很好地解决好跟C和C++混编的问题。随着时间推移,Swift在整个iOS/Mac工程中占的代码比例会越来越多,而Objective-C作为粘合层还是会存在。只是等你真正使用Swift编写一两个项目,就回不了头。Swift有些简便快速的写法,在Objective-C中是没有办法做到的。并且Swift的一些语言特性避免了很多Objective-C的坑。使用Swift编写的任何功能,使用Objective-C也可以做到,但是会麻烦

  7. Swift 3.0 API设计准则

    Swift代码的简洁性,不是指使用最少的字符来实现程序代码。Swift编程的简洁性带来的一个副作用是由强类型系统和减少引用文件的特性决定的。使用Swift的标记语法,为每一个方法和属性写注释性文本。{在初步设计时,编写注释性文档是一个好的主意,因为这能使你对API设计有更深入地理解,从而有利用于API的进一步设计。

  8. 2017 年热门编程语言排行榜,你的语言上榜没?

    2016年11月的排名结果显示,Java依然是最受大家欢迎的语言,C和C++排名紧随其后。GitHub在2016年9月年度会议之前,Github在此分享了其统计报告。随后它在平台上公布了热门语言排行表。该公司支持30多种编程语言,用户可随心选择。按照使用量排名,Java排在第一位,Javascript,PHP和C以一万多的差距尾随其后。

  9. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  10. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部