Cocos2d-x 浅谈Lua与C++函数间互相调用问题

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]

博客地址:http://blog.csdn.net/qq446569365

使用LUA开发游戏的时候,LUA与C++函数间的互相调用是必然遇到的问题。虽说LUA运行效率已经是脚本语言中“最快”的了。但是其在运行复杂算法和多线程运算的能力上,比C++差的太远了。所以LUA与C++之间互相调用是非常常见的。那么,如何将自己写的C++程序绑定进LUA中呢?

注:这个只是一些小函数的绑定方法,如果是将C++的类绑定进入LUA中可以采用tolua++,对于这个工具的使用我会在下一篇帖子再进行详细介绍,这里就不赘述了。

首先是将C++函数绑定进LUA,也就是从LUA中调用C++的函数

  1. staticinthttpSend(lua_State*L)
  2. {
  3. constchar*url=lua_tostring(L,1);
  4. return0;
  5. }<spanstyle="font-size:18px;"><spanstyle="font-family:Arial;color:#333333;"><spanstyle="line-height:26px;">
  6. </span></span></span>
首先,先声明一个static的函数,返回值必须是int参数只有一个 lua_State *L

然后AppDelegate::applicationDidFinishLaunching()函数中加入

lua_register(L,"APhttpSendMethod",httpSend);

这个是将C++函数注册到LUA虚拟机中,然后在lua中可以通过APhttpSendMethod("123")调用C++的方法

copy
    boolAppDelegate::applicationDidFinishLaunching()
  1. autoengine=LuaEngine::getInstance();
  2. ScriptEngineManager::getInstance()->setScriptEngine(engine);
  3. lua_State*L=engine->getLuaStack()->getLuaState();
  4. lua_module_register(L);
  5. lua_register(L,"APhttpSendMethod",httpSend);//这句
  6. if(engine->executeScriptFile("src/main.lua")){
  7. returnfalse;
  8. }
  9. true;
  10. }
在让lua调用方法中,lua传入的参数是通过 lua_tostring这种宏定义来获取的。

constchar* url =lua_tostring(L,1);

所有数据类型都可以通过类似于lua_tostring的方式来读取,第二个参数可以简单的理解成第几个参数。

关于这块儿的知识更多详细内容可以查看Lua程序设计一书,讲解的十分清楚,我就不露怯了!

其次,返回值return 0 是表示,C++函数会返回几个返回值给lua 通过lua_pushstring来像lua返回返回值。


下面是C++调用LUA的函数,首先有一点需要说明,C++调用lua函数,会重新载入一次lua函数所在的文件

copy

    voidhttpReceive()
  1. lua_State*ls=cocos2d::LuaEngine::getInstance()->getLuaStack()->getLuaState();//获取lua虚拟机
  2. std::stringscriptPath=cocos2d::FileUtils::getInstance()->fullPathForFilename("httpCallback.lua");//载入lua函数所在文件
  3. intisOpen=luaL_dofile(ls,scriptPath.c_str());//打开文件
  4. if(isOpen!=0){
  5. cclOG("AppDelegatehttpReceive-->OpenLuaError:%i",isOpen);
  6. return;
  7. }
  8. lua_getglobal(ls,"httpCallback");//获取lua的函数也就是要调用函数
  9. lua_call(ls,0);//执行!俩参数分别是你给lua函数传入了几个函数,lua函数将返回几个函数
  10. }<spanstyle="font-size:18px;">
  11. </span>
至于lua函数,非常简单,

function httpCallBack()

end

就可以了

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...