日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2dx-Lua与Object的通讯机制

發布時間:2024/10/12 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2dx-Lua与Object的通讯机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載于: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 寫的中間層,用來溝通 91 SDK 和 Lua 代碼。

Objective-C 代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + (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]; }

由于無法直接獲取 Objective-C 方法的參數個數和類型,所以如果要從 Objective-C 方法里接收 Lua 傳遞的參數,那么只能以 NSDictionary 的形式。

上述代碼中,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);

相比 LuaJavaBridge,CCLuaObjcBridge 更容易使用、傳遞數據也更方便。以后 LuaJavaBridge 也會更名為 CCLuaJavaBridge,并使用相同的值傳遞機制。

OC直接調用lua全局方法:

? ??cocos2d::CCLuaEngine::defaultEngine()->executeGlobalFunction("luaGlobalfunctionOnPause");

轉載于:https://www.cnblogs.com/guangyun/p/5020201.html

總結

以上是生活随笔為你收集整理的cocos2dx-Lua与Object的通讯机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。