【cocos2d-x从c++到js】注册函数
2014-03-26 11:51
204 查看
前面的文章中讲过,在游戏启动时,会调用大量的addRegisterCallback函数,向SpiderMonkey注册Cocos2d-x引擎的函数。
以register_all_cocos2dx注册函数为例,跳转到实现代码:
首先看到的是从根对象中获取一个“cc”属性(如果获取不到,就新建一个),因为JS中没有名字空间的概念,所以我们使用一个cc对象来表示类似的功能。所有的类型和函数都是这个cc对象下面的属性。在Cocos2d-x 3.0中,C++层面,类名去掉了CC的前缀,和js保持一致。
然后就是一大堆子函数,每个函数都负责注册一个对应的类。打开js_register_cocos2dx_Sprite,这个函数负责注册Sprite类。
打开js_register_cocos2dx_Sprite的实现代码
看起来比较长,其实很简单,我们一段一段分析。
首先,我们构造了一个JSClass对象,这个对象保存了一部分Sprite类的相关信息(注意,只是一部分而已)。其中包括类名,还有大量函数的占位符JS_XXXStub,这些函数是在一定情况下被调用的,如:添加删除属性,查看修改属性等等。这块其实不用特别关注,因为使用的都是SpiderMonkey自带的缺省实现。Cocos2d-x引擎只是在最后把finalize函数替换成自己的函数了。最后那个参数表示这个类,有几个Reserved
Slots槽,这东西我们在之前讲回调函数的时候见过。
然后是填写大量的参数,包括属性,静态属性,函数,静态函数。注意,因为Cocos2d-x的类完全使用Setter和Getter,所以一般是没有属性和静态属性的。比较重要的是静态函数和普通函数。我们看一下宏函数JS_FN。他的第一个参数是函数名,这个和C++层的函数命名是一致的,第二个参数在SpiderMonkey调用JS层对应的C++函数时的回调函数,这个函数我们之前的文章中分析过。第三个参数是函数调用时的参数个数。最后一个参数,是一些访问特性,JSPROP_PERMANENT表示不可删除,JSPROP_ENUMERATE表示在枚举时可见(JS的for遍历)。
因为JS使用的是原型继承,那么我们需要构造一个原型,需要的参数也很多,都是我们上面配置好的,上下文,父对象,原型,JSClass对象,各种属性和函数。然后,会自动把这个原型设置为global(就是之前的cc对象)的一个属性。最后,设置好访问特性。
最后这段代码是Cocos2d-x引擎自己做的一个设计,把类型信息存到一个map里,这个设计以后会经常见到。可以用来查询,另外在JS虚拟机清空时,也用来遍历删除对应的类型信息。做法是先放到一个map里,然后cleanup时遍历这个map即可。就不赘述了。
然后就是一大堆子函数,每个函数都负责注册一个对应的类。打开js_register_cocos2dx_Sprite,这个函数负责注册Sprite类。
打开js_register_cocos2dx_Sprite的实现代码
Slots槽,这东西我们在之前讲回调函数的时候见过。
相关文章推荐
- 【cocos2d-x从c++到js】14:注册函数 推荐
- 【cocos2d-x从c++到js】注册函数
- 【cocos2d-x从c++到js】JS与C++的交互2——JS与C++的“函数重载”问题
- 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题 推荐
- 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题
- 【cocos2d-x从c++到js】JS与C++的交互2——JS与C++的“函数重载”问题
- CEF完整嵌入DUI窗体(五) --JS调用C++注册的函数
- 【cocos2d-x从c++到js】JS与C++的交互2——JS与C++的“函数重载”问题
- 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题
- Cocos2d-x3.3Final(6)Slider常用成员函数(C++)
- asp.net后台向前台注册js函数和数组
- C++调用JS函数
- CDHtmlDialog的基本使用(JS调用C++函数的实现)
- 【cocos2d-x从c++到js】回调函数2——JSCallbackWrapper
- cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding
- 【cocos2d-x从c++到js】11:JS与C++的交互3——C++和JS类型转换
- 【cocos2d-x从c++到js】JS与C++的交互1——JS代码调用C++代码
- 【Cocos2d-x lua篇006】Lua调用C++的函数
- c++与js脚本交互,C++调用JS函数/JS调用C++函数
- C++中类型注册有的时候,函数找不到定义,可能是相应的头文件中防止重定义的声明,还是用原来的,没有做相应的更新