cocos2dx-Lua与Object的通讯机制
2015-12-04 18:42
525 查看
本文转载于:http://blog.csdn.net/liangliang103377/article/details/43269693
CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案
月初的时候,发了一篇关于 Lua 与 Java 互操作的文章,里面提到了我创建的 LuaJavaBridge 工具。现在,最新的 Lua 与 Objective-C 互操作工具也出来了。因为是专门针对 cocos2d-x 的,所以命名为 CCLuaObjcBridge。PS: 以前的 LuaJavaBridge 也会改名为 CCLuaJavaBridge,并且参考现在 CCLuaObjcBridge 的实现,做了不少改进,完成后也会发布。
CCLuaObjcBridge(后文简称 luaoc)的功能就是从 Lua 里直接掉用“任意 Objective-C 类方法”。利用这个特性,封装各种 iOS 上的库简直碉堡了,堪称 cocos2d-x Lua 游戏开发的神器 ^_^
luaoc 的主要特征
可以从 Lua 调用 Objective-C Class Method调用 Objective-C 方法时,支持 int/float/boolean/String/Lua function/Lua table 六种参数类型
可以将 Lua function 作为参数传递给 Objective-C,并让 Objective-C 保存 Lua function 的引用
可以从 Objective-C 调用 Lua 的全局函数,或者调用引用指向的 Lua function
主要功能和 luaj 是一样的,但相比老版本 luaj 做了一些针对 Objective-C 的调整。
luaoc 用法示例
下面的代码演示了如何调用 91 SDK:Lua 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | -- 注册回调函数,在玩家离开 91 平台界面时显示一个消息 -- PS: 91 SDK 的支付接口不会直接返回状态给客户端,支付需要在服务端验证 local function callback(event) if event == "SDKNDCOM_LEAVE_PLATFORM" then print("充值正在进行中,稍候您就能收到金币啦") end end luaoc.callStaticMethod("SDKNdCom", "registerScriptHandler", {listener = callback}) -- 进入 91 的支付接口 local args = { orderId = "order-00001001001", coins = 1000, } local ok, ret = luaoc.callStaticMethod("SDKNdCom", "payForCoins", args) if not ok then print(string.format("SDKNdCom.payForCoins() - call API failure, error code: %s", tostring(ret))) end |
Objective-C 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1920 | + (NSDictionary *) payForCoins:(NSDictionary *)dict { NSString *orderId = [dict objectForKey:@"orderId"]; if (!orderId || [orderId length] == 0) { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef string = CFUUIDCreateString(NULL, theUUID); CFRelease(theUUID); orderId = [(NSString *)string autorelease]; } int coins = 0; if ([dict objectForKey:@"coins"]) { coins = [[dict objectForKey:@"coins"] intValue]; } NSString *description = [dict objectForKey:@"description"]; if (!description) { description = @""; } int ret = [[NdComPlatform defaultPlatform] NdUniPayForCoin:orderId needPayCoins:coins payDescription:description]; return [NSDictionary dictionaryWithObjectsAndKeys:orderId, @"orderId", [NSNumber numberWithInt:ret], @"error", nil]; } |
上述代码中,Lua 端传递了一个包含 orderId 和 coins 的表格作为参数。这个表格会被 luaoc 自动转换为 NSDictionary 对象,并传入 payForCoins:(NSDictionary*) 方法。
不过从 Objective-C 返回值给 Lua 时,就可以返回各种类型的值。目前支持的值类型有 int/float/BOOL/NSString/NSDictionary。特别是可以返回 NSDictionary 类型后,Lua 代码从 Objective-C 端获取数据就简单很多了。
从 Objective-C 调用 Lua
由于 CCLuaObjcBridge 已经集成到quick-cocos2d-x(一个基于 cocos2d-x 的 Lua 游戏引擎)中,所以从 Objective-C 调用 Lua 也更简单灵活:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // functionId 是 Lua function 的引用 ID,参考 LuaJavaBridge 文章中的描述 // 1. 将引用 ID 对应的 Lua function 放入 Lua stack CCLuaObjcBridge::pushLuaFunctionById(functionId); // 2. 将需要传递给 Lua function 的参数放入 Lua stack CCLuaValueDict item; item["title"] = CCLuaValue::stringValue("hello"); item["coins"] = CCLuaValue::intValue(1000); item["success"] = CCLuaValue::booleanValue(TRUE); CCLuaObjcBridge::getStack()->pushCCLuaValueDict(item); // 3. 执行 Lua function CCLuaObjcBridge::getStack()->executeFunction(1); // 4. 释放引用 ID CCLuaObjcBridge::releaseLuaFunctionById(callbackId); |
CCLuaObjcBridge::getStack() 会返回一个 CCLuaStack 对象的指针。
CCLuaStack 是 quick-cocos2d-x 引入的新对象,封装了 Lua stack 的一些常用操作。例如要将值放入 Lua stack 就提供了下列方法,支持各种数据类型:
1 2 3 4 5 6 7 8 9 10 | void pushInt(int intValue); void pushFloat(float floatValue); void pushBoolean(bool boolValue); void pushString(const char* stringValue); void pushString(const char* stringValue, int length); void pushNil(void); void pushCCObject(CCObject* objectValue, const char* typeName); void pushCCLuaValue(const CCLuaValue& value); void pushCCLuaValueDict(const CCLuaValueDict& dict); void pushCCLuaValueArray(const CCLuaValueArray& array); |
OC直接调用lua全局方法:
cocos2d::CCLuaEngine::defaultEngine()->executeGlobalFunction("luaGlobalfunctionOnPause");
相关文章推荐
- cocos2dx-Lua与Java通讯机制
- cocos 2dx 换机器编译的时候出现No rule to make target 问题
- 十、cocos2d-x 字体描边和制作阴影
- VS2013 + quick-cocos2dx + BabeLua 环境搭建
- Cocos2d-x中__Dictionary,SQLite数据处理
- cocos2d-x -----文件的读取
- cocos2dx-3.4 编译apk包 文件名、目录名或卷标语法不正确 解决方案
- Cocos2D-x HelloWorld代码执行过程
- 【cocos2d-x打包问题】之“serializing cdt project settings” has encountered a problem
- cocos2d-js开发总结
- 【Cocos2d-x 3.x】 事件处理机制源码分析
- cocos2d-x札记 (二)----CCDirector深入
- cocos2d-x 学习笔记3
- COCOS2D-3.9 FileUtils 分析(一)
- 【Cocos2d-x学习记录】基于Mac OS iPhone开发环境搭建
- cocos2d 消息映射
- quick-cocos2dx修改java文件后如何生效
- cocos2d-x getVisibleSize , getVisibleOrigin 和坐标位置日记
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方