cocos2d-x技術(shù)群新群:117871561
c++技術(shù)交流群:593010226
callStaticMethod方法的原型是:
-- 調(diào)用Objective-C類的接口。
-- @function [parent=#luaoc] callStaticMethod
-- @param string className Objective-C類名
-- @param string methodName Objective-C類方法名
-- @param table args Objective-C類方法所需要的各種參數(shù)字典,key值為方法的參數(shù)名
-- @return boolean#boolean ret (return value: bool) ok, mixed ret ok為是否調(diào)用成功, ok為true時,ret為Objective-C方法的返回值,ok為false時,ret為出錯原因
function luaoc.callStaticMethod(className, methodName, args)
end
- lua調(diào)用OC方法
OC代碼OCClass類中一個方法:
+ (NSString *)getNum:(NSDictionary *)dic {
return @"111";
}
那么,lua代碼要調(diào)用getNum這個方法的話,需要這樣實(shí)現(xiàn):
local luaoc = require "cocos.cocos2d.luaoc"
local arg1 = {callBack = LGfunc}
local arg2 = {types = 1,maxCount = 4,original = 1}
local OCClass = "AppController"
result, version = luaoc.callStaticMethod(“OCClass”, “getNum”, arg1)
OCClass就是要調(diào)用的類名
getNum就是方法名
arg1和arg2是傳遞給oc的參數(shù),arg1這樣寫是為了讓oc回調(diào)lua的LGfunc函數(shù),后面詳細(xì)講。arg2是以字典(oc中稱字典)的形式給oc傳遞參數(shù),這里要注意的是,types,maxCount這些都不帶雙引號“”的。
這樣,在控制臺就可以看到打印出了 “111”,這就意味著lua調(diào)用OC函數(shù)成功了。
要注意的是:OC里被調(diào)用方法必須是類方法,也就是前面是“+”號的方法!
- OC調(diào)用lua方法
在上面所講的lua中的代碼實(shí)際上已經(jīng)把自己的LGfunc方法的ID通過參數(shù)arg1傳遞給了OC的getNum方法。這時,只需要修改getNum方法為:
+ (NSString *)getNum:(NSDictionary *)dic {
int handlerID = (int)[[dic objectForKey:@"callBack"] integerValue];
LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調(diào)用的方法id(假設(shè)方法為XG)
LuaStack *stack = LuaBridge::getStack(); //獲取lua棧
stack->pushString("oc call lua method..."); //將需要通過方法XG傳遞給lua的參數(shù)壓入lua棧
stack->executeFunction(1); //根據(jù)壓入的方法id調(diào)用方法XG,并把XG方法參數(shù)傳遞給lua代碼
LuaBridge::releaseLuaFunctionById(handlerID); //最后記得釋放
return @"111";
}
并且要在OC的這個類中引入:
#import "cocos2d.h"
#import "CCLuaEngine.h"
#import "CCLuaBridge.h"
using namespace cocos2d;
需要注意的是:將.m文件改成.mm文件,用來支持c++的寫法。
如果lua中的LGFunc函數(shù)如下:
local function LGfunc()
print("callBack succeed")
end
那么在控制臺就可以看見打印"callBack succeed"。
但是,上面的例子中,OC調(diào)用lua是基于lua調(diào)用OC的基礎(chǔ)上,如果lua不調(diào)用OC,那么OC貌似就沒辦法主動調(diào)用lua函數(shù)?我們不難發(fā)現(xiàn),只要OC得到lua函數(shù)的id(也就是上面例子中的handleID),就可以調(diào)用。
所以,如果你知道以后要調(diào)用lua的哪個方法,就提前把這個方法的id傳給OC,然后在需要的時候,OC就可以直接調(diào)用lua的方法了。
3.OC向lua傳遞形參
OC在調(diào)用lua函數(shù)的時候,如果lua的函數(shù)是個帶形參的函數(shù),怎么辦?先上代碼:
+ (NSString *)getNum:(NSDictionary *)dic {
int handlerID = (int)
[[dic objectForKey:@"callBack"] integerValue];
LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調(diào)用的方法id(假設(shè)方法為XG)
//下面三行是重點(diǎn)
cocos2d::CCLuaValue item = cocos2d::CCLuaValue::intValue((int)button.tag);//包裝要傳遞的參數(shù)
cocos2d::CCLuaBridge::getStack()->pushCCLuaValue(item);//參數(shù)壓棧
cocos2d::CCLuaBridge::getStack()->executeFunction(1);//括號里面的1 是告訴lua傳遞的形參是1個
stack->executeFunction(1); //根據(jù)壓入的方法id調(diào)用方法XG,并把XG方法參數(shù)傳遞給lua代碼
LuaBridge::releaseLuaFunctionById(handlerID); //最后記得釋放
return @"111";
}
注釋很清楚了。如果要傳多個參數(shù),用json字符串傳:
cocos2d::CCLuaValue item = cocos2d::CCLuaValue::stringValue([@"lalala" UTF8String];