OC和coco2d JS相互调用
大家好,我是一个小小的屌丝程序猿,平时喜欢玩玩游戏,那我们的第一讲就从游戏开始吧!
首先看标题这个和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:@"我回来了"];
});
这就没有问题了