美文网首页我爱编程
OC和coco2d JS相互调用

OC和coco2d JS相互调用

作者: 安宇辛 | 来源:发表于2017-06-06 16:05 被阅读0次

    大家好,我是一个小小的屌丝程序猿,平时喜欢玩玩游戏,那我们的第一讲就从游戏开始吧!

    首先看标题这个和coco2d有关,有点人就开始激动了。

    NO1 我们先建一个coco2d js的项目  我们用官方推荐cocos creator创建

    NO2 我们先在OC里写一个弹出框

    +(BOOL)zyPoUpTitle:(NSString *) title andContent:(NSString *)content{

    [RKAlertView showAlertWithTitle:title message:content cancelTitle:@"取消" confirmTitle:@"确认" confrimBlock:^(UIAlertView *alertView) {

    NSLog(@"确认了");

    [self showViewController:nil];

    } cancelBlock:^{

    NSLog(@"取消了");

    }];

    return true;

    }

    然后我们在js里写调用的方法

    cc.find("Canvas/zyc").on(cc.Node.EventType.TOUCH_START, function (event) {

    cc.log("zykkkkk");

    var ret = jsb.reflection.callStaticMethod("zyGameTools",

    "zyPoUpTitle:andContent:",

    "OC和coco2d js相互调用",

    "孩子准备好了吗?让我们嗨起来!");

    Canvas/zyc是场景里面的按钮  上面的代码是按钮的点击事件

    jsb.reflection.callStaticMethod 就是我们来实现调用OC的关键代码

    zyGameTools是类名  zyPoUpTitle:andContent:是类方法名(注意有参数一定不要忘记:)

    "OC和coco2d js相互调用",

    "孩子准备好了吗?让我们嗨起来!"都是参数用,分割  函数没有参数可以不带

    NO3 话不多说我们来试试

    我们成功了,哈哈,自己给自己个掌声

    NO4我们来实现用OC调用JS方法

    首先我们还是先写一个js方法

    onOC: function(cmd) {

    this.label.string = cmd;

    }

    然后我们这样用OC调用

    注意:1.下面的方法要写在.mm文件里 如zyGameTools.mm

                2.导入相应的依赖库   

                         #include "cocos2d.h"

                         #include "cocos/scripting/js-bindings/jswrapper/SeApi.h"

    +(void)zyJsBackFind:(NSString *) find JS:(NSString *)js Func:(NSString*) func withParam:(NSString*) param{

    NSString *zyroot = [NSString stringWithFormat:@"cc.find('%@').getComponent('%@').%@('%@');",find,js,func,param];

    std::string param001 = [zyroot UTF8String];

    std::string jsCallStr = cocos2d::StringUtils::format("%s", param001.c_str());

    se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());

    }

    这是我自己封装的方法

    /**

    OC 调用coco2d js

    @param find 场景名字

    @param js js类名

    @param func 方法名

    @param param 方法参数(返回字符串  如果有多个参数用,分割如:name,city,headimgurl)

    */

    好了我们来调用吧

    [self zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC" withParam:resp.name];    resp.name是微信登录后返回的用户名 你们可以改成你们想返回的参数内容

    NO5 OC回调的方法必须在主线程执行

    如何我我们在非主线程执行

    [zyGameTools zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC2" withParam:@"我回来了"];

    会报错

    没有在主线程报错

    我们必须保证在主线程执行

    dispatch_async(dispatch_get_main_queue(), ^{

    [zyGameTools zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC2" withParam:@"我回来了"];

    });

    这就没有问题了

    NO6我们总的来测试一下

    相关文章

      网友评论

        本文标题:OC和coco2d JS相互调用

        本文链接:https://www.haomeiwen.com/subject/reagfxtx.html