cocos2d-js 自动绑定代码

来源:互联网 发布:嵌入式软件出口退税 编辑:程序博客网 时间:2024/05/18 00:51

之前在接入sdk 的时候,因为sdk那边分了 android 和 ios 写两次吧,改的时候也难得改,所以直接写在了c++层 ,这样大家都方便,可是自己写的代码,如何在js调用呢,后面发现,cocos 是提供了这方面的东西的,我们只需要做一个小小的改动就可以直接使用了,直接进入正题:

关于接的sdk,我就不贴出来了,sdk ,你懂得 恶心的很 这里纯粹做个例子


js new 工程我就不说了 自己百度

1, frameworks/runtime-src/Classes/testBind   新建两个文件  这里是测试 我附上代码 

TestBind.hpp



#ifndef TestBind_hpp

#define TestBind_hpp


#include <stdio.h>

#include "cocos2d.h"

#include <stdio.h>


//这里必须定义空间名称

namespace TestBind {

    class TestBindCalss

    {

    public:

        void testPrint();

        

    private:

        void testPrintPrivate();

        

    protected:

        void testPrintProtected();


    };

};


#endif /* TestBind_hpp */


TestBind.cpp:

#include "TestBind.hpp"


namespace TestBind {

    voidTestBindCalss::testPrint(){

        CCLOG("%s","测试绑定代码 ---- testPrint");

    }

    

    voidTestBindCalss::testPrintPrivate(){

     CCLOG("%s","测试绑定代码 ---- testPrintPrivate");

    }

    

    voidTestBindCalss::testPrintProtected(){

        CCLOG("%s","测试绑定代码 ---- testPrintProtected");

    }

    

}


这就是个简单的c++ 程序代码,先放到这里,我们去准备绑定需要的东西


因为一般是为当前项目准备的  那么  为了不影响另外的项目  在我们的工程下 新建 一个文件夹  

tools/tojs  (为什么这么命名? 因为cocos 是这么命名的 我也跟着他命名)

接下来是很关键的一步 

在你的cocos引擎下 这个目录 

cocos_tool/cocos2d-x-3.13/tools  找到  bindings-generator 拷贝到     项目工程的 tools/tojs 

ps: 这里最好是拷贝你当前的引擎的  bindings-generator   版本不同 会出问题 ,如果后面出了问题 ,那么请确认 这里是不是有问题

原本 cocos 是有文件的 那么我们拿来简单用就行了 

老规矩 拷贝-----  cocos2d-x-3.13/tools/tojs/genbindings.py   ---->   tools/tojs/genbindings.py 

什么 你想试试 ?  好 我们先试试

tools/tojs ⮀ ⭠ develop ●✚ ⮀ python genbindings.py 
PYTHON_BIN not defined, use current python.
generating userconf.ini...
Generating bindings for cocos2dx...
/usr/bin/python: can't open file '/。。。。。。/tools/bindings-generator/generator.py': [Errno 2] No such file or directory
-------------------------------------
Generating javascript bindings fails.
-------------------------------------

什么 路径有问题? 那我们打开文件看看 找到  给 cocos_root = os.path.abspath(project_root)  赋值的地方  

因为我们是针对当前项目的 改了吧  改到当前工程来

  cocos_root = os.path.abspath(os.path.join(project_root, 'frameworks', 'cocos2d-x'))

 万一你要是不高兴 改了自己项目下的东西 想跑一个 试试呢 对吧 

好 第二个路径 

   jsb_root = os.path.abspath(os.path.join(project_root, 'cocos/scripting/js-bindings'))

这个路径嘛  无所谓 高兴用哪个就用哪个

jsb_root = os.path.abspath(os.path.join(cocos_root,'cocos/scripting/js-bindings'))  

下一个

 cxx_generator_root = os.path.abspath(os.path.join(project_root, 'tools/bindings-generator'))

这个很重要,他是问你 使用哪个解析器  那不废话吗  用我们刚刚拷贝的那个就行了,,接着改吧

 cxx_generator_root = os.path.abspath(os.path.join(project_root, 'tools/bindings-generator'))


一般的话  我们输出的东西 针对当前项目修改的c++文件 我们都是放在 runtime-src 下 便于管理 和 使用 


好 那我们定义一个  直接写在  cxx_generator_root 后面就行了

  runtime_src = os.path.abspath(os.path.join(project_root, 'frameworks','runtime-src'));


往下  有个 # save config to file


好吧 我们也做一次 

 config.set('DEFAULT', 'runtime_src', runtime_src)


下面的就是一些基本配置了 

        tojs_root = '%s/tools/tojs' % project_root
        output_dir = '%s/cocos/scripting/js-bindings/auto' % project_root


改吧  别废话 

tojs_root = '%s/tools/tojs' % project_rootoutput_dir = '%s/cocos/scripting/js-bindings/auto' % project_rootcmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'jsb_cocos2dx_auto'), \            }

 cmd_args = 这个就是你要执行的配置了  里面的内容 全部干掉  没错 就是全部干掉

ps 这部分的完整内容

project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))cocos_root = os.path.abspath(os.path.join(project_root, 'frameworks', 'cocos2d-x'))jsb_root = os.path.abspath(os.path.join(cocos_root,'cocos/scripting/js-bindings'))cxx_generator_root = os.path.abspath(os.path.join(project_root,'tools/tojs/bindings-generator'))runtime_src = os.path.abspath(os.path.join(project_root, 'frameworks','runtime-src'));# save config to fileconfig = ConfigParser.ConfigParser()config.set('DEFAULT', 'androidndkdir', ndk_root)config.set('DEFAULT', 'clangllvmdir', llvm_path)config.set('DEFAULT', 'cocosdir', cocos_root)config.set('DEFAULT', 'jsbdir', jsb_root)config.set('DEFAULT', 'cxxgeneratordir', cxx_generator_root)config.set('DEFAULT', 'extra_flags', '')config.set('DEFAULT', 'runtime_src', runtime_src)

 在 

jsb_root

地方 不要用 # 注释  如果报错 那么一般都是你 加了 注释的原因 


想试试 ? 好吧 我们去拷贝一个试试  去拷贝  引擎下 /tools/tojs/cocos2dx.ini  到 项目工程 tools/tojs 下  



最激动的时候来了 执行 python genbindings.py  等待几秒钟 出现 就成功了 



咦, 我不是定义了输出路径是 生成到哪里去了  发现在工程下 多了个cocos 文件夹




这就是我们刚刚跑代码生成的文件 api 生成到 api 目录的  不是制定输出到 runtime 下吗  

反过去看 原来是这里没改  runtime-src 都没有使用过  好吧 接着改 

output_dir = '%s/cocos/scripting/js-bindings/auto' % project_root
改为

output_dir = '%s/cocos/scripting/js-bindings/auto' % runtime_src

再跑  ,



非常nice  生成成功 


现在来开始研究ini 文件 说实话 我也不是很懂 但是 能够用就行了 

一般来讲 我们只需要配置这几个东西就行了   拷贝一份 cocos2d.ini  

改这几个东西 

1, 首行   刚刚我们写的 TestBind  那么就叫这个东西吧  [TestBind]

2,prefix = cocos2dx    改为 prefix =TestBind 


3,target_namespace = cc  这个是你绑定到js 层 要使用的名字 一般 我们用 项目名称 这里 我们就用 projectName  

target_namespace = projectName

4,headers = 你要绑定的头文件  ===>   headers =  %(runtime_src)s/Classes/testBind/TestBind.hpp

5, classes =  需要绑定的类名称  

 classes =  TestBindCalss

6, classes_need_extend =   //他没有继承任何东西 所以  我们不写  删掉后面的赋值就行了

classes_need_extend =


下一步 我们在 genbindings.py 修改配置   顺便我重新修改了输出路径  


tojs_root = '%s/tools/tojs' % project_rootoutput_dir = '%s/js-bindings_test/auto' % runtime_srccmd_args = {#'cocos2dx.ini' : ('cocos2d-x', 'jsb_cocos2dx_auto'), \'cocos2dx_copy.ini' : ('TestBind', 'TestBind_auto')            }

执行 





似乎是执行成功了 我们去看看   路径下 

js-bindings_test/auto





观察 :



这里只导出了 public 的东西 需要的筒子们 自己注意下 别所到时候没有导出来 


是不是这个时候就可以用了呢 当然不行  我们最重要的 事情还没有做 


打开 appdelegate 

引入头文件  

#include "js-bindings_test/auto/TestBind_auto.hpp"

然后在 


sc->addRegisterCallback 这里 注册


//增加 

sc->addRegisterCallback(register_all_TestBind);

切记 写好注释  

那么究竟是怎么找到究竟注册哪个呢  看下面:


js-bindings_test/auto/TestBind_auto.hpp 

找到这个 对了 就是这个 





重新编译工程  你会发现 


ps js 层用法 

projectName.TestBindCalss.testPrint();



即可 



只有 public 的东西才会被绑定出来 使用的时候 自己注意,


ok,教程完毕,有什么不懂的 可以加我扣扣 465648890 大家一起交流,学习互进!



















2 0
原创粉丝点击