[iOS游戏开发必备]-Lua与OC交互完整版(含Demo)

2017-01-14 10:02:56来源:http://www.jianshu.com/p/b0c56287c386作者:香蕉大大人点击

第七城市

背景


最近一直在忙着游戏相关的工作,然后弄了好一段时间,刚好现在可以给大家写一篇关于Lua和OC交互的内容,主要使用的是coco2dx3.0的版本,如果是这个版本以下不能说没变哈~
记得自己一直在踩坑,网上的资料比较乱,所以不耻把自己的项目加以整理!
由于项目为公司的,所以我只把关键代码给大家做学习,提供思路哈,希望大家能自行整理,如果有不足的地方希望大家给我补充:GitHubDemo


正文


思路:
-- 加载luaoc库,从OC角度思考就是实例化,才能使用里面的方法
-- 传入(类别,类方法,回调的参数)注意,只能回调类方法!


目录


简单的OC与lua实时调用,立即返回值
有延时的OC与lua延时回调,使用回调函数(得使用lua的回调)

1.简单的OC与lua实时调用,立即返回值

Lua部分


--导入LUA转OC的函数!并且实例化
--这里使用的是OC里面,一个
local luaoc = require "cocos.cocos2d.luaoc";
luaoc.callStaticMethod("AppController", "loginForGame", param)
end
end

OC部分


注意lua调用OC方法最重要就是需要有类方法!
+ (NSDictionary *) loginForGame:(NSDictionary *)idInfo
{
NSString *password = [idInfo objectForKey:LoginPWD];
if (!password || [password length] == 0)
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
password = [(NSString *)string autorelease];
}
//这里可以传值直接使用NSDictionary格式!,传过去Lua就是table值,这里就是一个实时回传的值!
return idInfo;
}

2.有延时的OC与lua延时回调,使用回调函数(得使用lua的回调)

Lua部分


在自己使用部分调用
--make tmp value to send 10 coins To web
local param = {totalCoin=tostring(self.totalChangCoin),exchanCoin=tostring(self.exchangeCoin)}
--game Communicate with OC
//和OC一样导入库
local luaoc = require "cocos.cocos2d.luaoc";
//调用库文件,访问"ZSExchangePlanformCenter"类中"+loginForGame"方法
luaoc.callStaticMethod("ZSExchangePlanformCenter", "loginForGame", param)

OC部分


1.修改.m文件为.mm文件(目的为了兼容C++),Lua就是基于C++封装的,所以调用他的API也是C++的


2.注意需要导入:


#import "CCLuaBridge.h"
#import "CCLuaEngine.h"

3.正确的姿势使用传值


A.传字典
//这是讲字典值传过去
cocos2d::LuaValueDict item;
//注意这里需要把OC字符串转C字符串
item["token"] = cocos2d::LuaValue::stringValue([token UTF8String]);
item["roleid"] = cocos2d::LuaValue::stringValue([numStr UTF8String]);
stack->pushLuaValueDict(item);
stack->pushString("oc传递给lua的参数"); //将需要传递给lua层的参数通过栈传递
B.传字符串(建议直接传字符串!)格式{a= "asd" ,b =123}
注意:key不需要单/双引号,value如果为字符串要加单/双引号
格式如下:
NSString *dicStr =[NSString stringWithFormat:@"{token=/"%@/",roleid=/"%@/"}",token,idnum];
stack->pushString([dicStr UTF8String]);

4.完整使用方法:


+ (NSDictionary *) loginForGame:(NSDictionary *)idInfo
{
NSString *account = [idInfo objectForKey:LoginAccount];
if (!account || [account length] == 0)
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
account = [(NSString *)string autorelease];
}
NSString *password = [idInfo objectForKey:LoginPWD];
if (!password || [password length] == 0)
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
password = [(NSString *)string autorelease];
}
//调用lua中名为gamecallback的回调
int handlerID = (int)[[idInfo objectForKey:GameCallBack] integerValue];
NSObject *a = [NSObject new];
//这里仅仅举例,如果采用了网络延时就可以用这个方法,之前用了一个线程阻塞的方法,并不好
a.block = ^(id info){
cocos2d::LuaBridge::pushLuaFunctionById(handlerID); //压入需要调用的方法id
cocos2d::LuaStack *stack = cocos2d::LuaBridge::getStack(); //获取lua栈
NSString *dicStr =[NSString stringWithFormat:@"{token=/"%@/"}",info];
stack->pushString([dicStr UTF8String]);
stack->executeFunction(1); //共有1个参数 (“oc传递给lua的参数”),这里传参数 1
cocos2d::LuaBridge::releaseLuaFunctionById(handlerID);
}
//这里可以传值直接使用NSDictionary格式!,传过去Lua就是table值,这里就是一个实时回传的值!
return info;
}

如果有疑问可以自己上我的git下载相关的Demo,喜欢的话麻烦给我点个赞!谢谢


如何对我写的技术文章满意,下方给我点个喜欢呗
你的点赞是我前进的动力,如果想一起利用碎片时间,欢迎关注


大家有任何问题,可以评论给我~如果写的不错,希望大家可以关注我。感谢。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台