大家好,我是一個小小的屌絲程序猿微姊,平時喜歡玩玩游戲,那我們的第一講就從游戲開始吧分预!
首先看標題這個和coco2d有關兢交,有點人就開始激動了。
NO1 我們先建一個coco2d js的項目? 我們用官方推薦cocos creator創(chuàng)建
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里寫調(diào)用的方法
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相互調(diào)用",
"孩子準備好了嗎笼痹?讓我們嗨起來配喳!");
Canvas/zyc是場景里面的按鈕 ?上面的代碼是按鈕的點擊事件
jsb.reflection.callStaticMethod 就是我們來實現(xiàn)調(diào)用OC的關鍵代碼
zyGameTools是類名? zyPoUpTitle:andContent:是類方法名(注意有參數(shù)一定不要忘記:)
"OC和coco2d js相互調(diào)用",
"孩子準備好了嗎?讓我們嗨起來凳干!"都是參數(shù)用,分割 ?函數(shù)沒有參數(shù)可以不帶
NO3 話不多說我們來試試
我們成功了晴裹,哈哈,自己給自己個掌聲
NO4我們來實現(xiàn)用OC調(diào)用JS方法
首先我們還是先寫一個js方法
onOC: function(cmd) {
this.label.string = cmd;
}
然后我們這樣用OC調(diào)用
注意: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 調(diào)用coco2d js
@param find 場景名字
@param js js類名
@param func 方法名
@param param 方法參數(shù)(返回字符串? 如果有多個參數(shù)用救赐,分割如:name,city,headimgurl)
*/
好了我們來調(diào)用吧
[self zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC" withParam:resp.name];? ? resp.name是微信登錄后返回的用戶名 你們可以改成你們想返回的參數(shù)內(nèi)容
NO5 OC回調(diào)的方法必須在主線程執(zhí)行
如何我我們在非主線程執(zhí)行
[zyGameTools zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC2" withParam:@"我回來了"];
會報錯
我們必須保證在主線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
[zyGameTools zyJsBackFind:@"Canvas" JS:@"HelloWorld" Func:@"onOC2" withParam:@"我回來了"];
});
這就沒有問題了